1 条题解
-
0梁文瀚LWH (winham) LV 10 @ 2023-5-16 21:21:41
// luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; const int inf=1<<30; long long top; struct Pool { long long w; long long h; long long id; Pool(long long ww=0,long long hh=0, long long _id=0):w(ww),h(hh),id(_id){}; }pool[maxn],struck[maxn]; long long n,m; long long ans[maxn]; long long now; inline long long read(){ register long long x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return (f==1)?x:-x; } int main() { long long temp=inf,id; n=read(); for(int i=1;i<=n;i++) { pool[i].w=read(); pool[i].h=read(); pool[i].id=i; if(temp>pool[i].h) { temp=pool[i].h; id=i; } } struck[++top]=pool[id]; struck[0].h=inf; long long l=id; long long r=id; long long p; pool[0].h=pool[n+1].h=inf; for(int i=1;i<=n;i++) { long long add=0; if(pool[l-1].h<pool[r+1].h) { p=--l; } else { p=++r; } while(pool[p].h>struck[top].h&&top) { struck[top].w+=add; ans[struck[top].id]=now+struck[top].w; now+=struck[top].w*(min(pool[p].h,struck[top-1].h)-struck[top].h); add=struck[top].w; top--; } pool[p].w+=add; struck[++top]=pool[p]; } for(int i=1;i<=n;i++) { printf("%lld\n",ans[i]); } return 0; }
- 1
信息
- ID
- 2419
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者