洛谷 P1901 发射站
程序员文章站
2022-04-09 15:28:10
[TOC] 题目 "戳" 思路 利用单调栈求出比他高的发射站中离它最近的哪一个,在暴力加一下,求出最终答案。 $Code$ cpp include define max_(a,b) a b?a:b; define MAXN 1000001 define rr register using names ......
目录
题目
思路
利用单调栈求出比他高的发射站中离它最近的哪一个,在暴力加一下,求出最终答案。
$code$
#include<bits/stdc++.h> #define max_(a,b) a>b?a:b; #define maxn 1000001 #define rr register using namespace std; int n,max1[maxn],max2[maxn],ans=0; int pwp[maxn]; struct info{ int h,w,num; }qwq[maxn]; stack<info> sss; inline int read(){ int x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f?-x:x; } int main(){ n=read(); for(rr int i=1;i<=n;++i){ qwq[i].h=read(); qwq[i].w=read(); qwq[i].num=i; } for(rr int i=1;i<=n;++i){ if(i==1){ sss.push(qwq[i]); max1[i]=0; }else{ while(qwq[i].h>sss.top().h){ sss.pop(); if(sss.empty()) break; } if(sss.empty()) max1[i]=0; else max1[i]=sss.top().num; sss.push(qwq[i]); } } while(!sss.empty()){ sss.pop(); } for(rr int i=n;i>=1;--i){ if(i==n){ sss.push(qwq[i]); max2[i]=0; }else{ while(qwq[i].h>sss.top().h){ sss.pop(); if(sss.empty()) break; } if(sss.empty()) max2[i]=0; else max2[i]=sss.top().num; sss.push(qwq[i]); } } for(int i=1;i<=n;++i){ if(max1[i]!=0) pwp[max1[i]]+=qwq[i].w; if(max2[i]!=0) pwp[max2[i]]+=qwq[i].w; ans=max_(ans,pwp[max1[i]]); ans=max_(ans,pwp[max2[i]]); } printf("%d\n",ans); return 0; }
推荐阅读