标签:include int luogu P1901 发射站 能量 接收 define
https://www.luogu.org/problem/P1901
题目描述
某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接收。
显然,每个发射站发来的能量有可能被 0 或 1 或 2 个其他发射站所接受,特别是为了安 全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计 算出接收最多能量的发射站接收的能量是多少。
输入格式
第 1 行:一个整数 N;
第 2 到 N+1 行:第 i+1 行有两个整数 Hi 和 Vi,表示第 i 个人发射站的高度和发射的能量值。
输出格式
输出仅一行,表示接收最多能量的发射站接收到的能量值,答案不超过 longint。
维护一个元素高度单调下降的栈
从左往右一次,从右往左一次
#include<iostream> #include<algorithm> #include<cstdio> #define ri register int #define u int #define NN 1000005 namespace fast { inline u in() { u x(0),f(1); char s=getchar(); while(s<'0'||s>'9') { if(s=='-'){ f=-1; } s=getchar(); } while(s>='0'&&s<='9') { x=(x<<1)+(x<<3)+s-'0'; s=getchar(); } return x*f; } } using fast::in; namespace all { struct node{ u h,v; }a[NN]; u stk[NN],r,as,ans[NN]; inline void solve(){ u N(in()); for(ri i(1);i<=N;++i){ a[i].h=in(),a[i].v=in(); } r=0; for(ri i(1);i<=N;++i){ u x(i); while(r&&a[stk[r]].h<=a[x].h) --r; ans[stk[r]]+=a[x].v; stk[++r]=x; } r=0; for(ri i(1);i<=N;++i){ u x(N-i+1); while(r&&a[stk[r]].h<=a[x].h) --r; ans[stk[r]]+=a[x].v; stk[++r]=x; } for(ri i(1);i<=N;++i){ as=std::max(as,ans[i]); } printf("%d",as); } } int main() { //freopen("x.txt","r",stdin); all::solve(); }
标签:include,int,luogu,P1901,发射站,能量,接收,define 来源: https://www.cnblogs.com/ling-zhi/p/11665436.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。