1. 程式人生 > >codeforces739C - Skills &&金中市隊兒童節常數賽

codeforces739C - Skills &&金中市隊兒童節常數賽

alt ret 表單 clas problem ++ splay printf ring

http://codeforces.com/problemset/problem/739/C 先上鏈接

這道題 對於蒟蒻的我來說還是很有難度的 調了很久

對於我的代碼 mx2是答案 mx1代表單調 mx2雙調 帶l,r的代表從哪邊開始 剩下的自己加油看吧 不是很長來著

技術分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=3e5+233,maxM=M<<1;
LL tag[maxM],vl[maxM],vr[maxM];
int lc[maxM],rc[maxM],sz[maxM],mx1l[maxM],mx1r[maxM],mx2[maxM],mx2l[maxM],mx2r[maxM]; int sum,n,m,L,R,w; int read(){ int ans=0,f=1,c=getchar(); while(c<0||c>9){if(c==-) f=-1; c=getchar();} while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();} return ans*f; } void
up(int x){ int l=lc[x],r=rc[x],v1,v2; vl[x]=vl[l]; vr[x]=vr[r]; mx1l[x]=mx1l[l]; if(mx1l[l]==sz[l]&&vr[l]>vl[r]) mx1l[x]+=mx1l[r]; mx1r[x]=mx1r[r]; if(mx1r[r]==sz[r]&&vl[r]>vr[l]) mx1r[x]+=mx1r[l]; /*mx2l[x]*/ v1=mx2l[l]; if(mx2l[l]==sz[l]&&vr[l]>vl[r]) v1+=mx1l[r]; v2
=0; if(mx1r[l]==sz[l]&&vl[r]>vr[l]) v2=mx1r[l]+mx2l[r]; mx2l[x]=max(v1,v2); /*mx2r[x]*/ v1=mx2r[r]; if(mx2r[r]==sz[r]&&vl[r]>vr[l]) v1+=mx1r[l]; v2=0; if(mx1l[r]==sz[r]&&vr[l]>vl[r]) v2=mx1l[r]+mx2r[l]; mx2r[x]=max(v1,v2); mx2[x]=max(mx2[l],mx2[r]); if(vr[l]>vl[r]) mx2[x]=max(mx2[x],mx2r[l]+mx1l[r]); if(vr[l]<vl[r]) mx2[x]=max(mx2[x],mx2l[r]+mx1r[l]); } void add(int x,LL w){vl[x]+=w; vr[x]+=w; tag[x]+=w;} void down(int x){ int l=lc[x],r=rc[x]; add(l,tag[x]); add(r,tag[x]); tag[x]=0; } void build(int l,int r){ int x=++sum; sz[x]=r-l+1; if(l==r){vl[x]=vr[x]=read(); mx1l[x]=mx1r[x]=mx2[x]=mx2l[x]=mx2r[x]=1; return ;} int mid=(l+r)>>1; lc[x]=sum+1; build(l,mid); rc[x]=sum+1; build(mid+1,r); up(x); } void insert(int x,int l,int r){ if(L<=l&&r<=R){add(x,w); return ;} int mid=(l+r)>>1; if(tag[x]) down(x); if(L<=mid) insert(lc[x],l,mid); if(R>mid) insert(rc[x],mid+1,r); up(x); } int main() { n=read(); build(1,n); m=read(); for(int i=1;i<=m;i++) L=read(),R=read(),w=read(),insert(1,1,n),printf("%d\n",mx2[1]); return 0; }
View Code

codeforces739C - Skills &&金中市隊兒童節常數賽