TYVJ1427 小白逛公园
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。
一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。
那么,就请你来帮小白选择公园吧。
一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择连续的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。
那么,就请你来帮小白选择公园吧。
输入格式
第一行,两个整数N和M,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。
接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。
接下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围(1≤a,b≤N);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。
其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。
接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。
接下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围(1≤a,b≤N);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。
其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。
输出格式
小白每出去玩一次,都对应输出一行,只包含一个整数,表示小白可以选出的公园得分和的最大值。
测试样例1
输入
5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
输出
2
-1
线段树结点维护:区间内最大答案,区间从左端开始的最大答案,从右端开始的最大答案,区间总和。
然后花式维护即可。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #define lc rt<<1 8 #define rc rt<<1|1 9 using namespace std; 10 const int mxn=500010; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 int n,m; 18 int data[mxn]; 19 struct node{ 20 int mx; 21 int ml,mr; 22 int smm; 23 }t[mxn<<2],tmp0; 24 void push_up(int l,int r,int rt){ 25 t[rt].smm=t[lc].smm+t[rc].smm; 26 t[rt].mx=max(t[lc].mx,t[rc].mx); 27 t[rt].mx=max(t[lc].mr+t[rc].ml,t[rt].mx); 28 t[rt].ml=max(t[lc].ml,t[lc].smm+t[rc].ml); 29 t[rt].mr=max(t[rc].mr,t[rc].smm+t[lc].mr); 30 return; 31 } 32 void Build(int l,int r,int rt){ 33 if(l==r){t[rt].mx=t[rt].ml=t[rt].mr=data[l];t[rt].smm=data[l];return;} 34 int mid=(l+r)>>1; 35 Build(l,mid,lc); 36 Build(mid+1,r,rc); 37 push_up(l,r,rt); 38 return; 39 } 40 void change(int p,int v,int l,int r,int rt){ 41 if(l==r){ 42 if(p==l){t[rt].ml=t[rt].mr=t[rt].mx=t[rt].smm=v;} 43 return; 44 } 45 int mid=(l+r)>>1; 46 if(p<=mid)change(p,v,l,mid,lc); 47 else change(p,v,mid+1,r,rc); 48 push_up(l,r,rt); 49 return; 50 } 51 node query(int L,int R,int l,int r,int rt){ 52 // printf("%d %d %d %d %d\n",L,R,l,r,rt); 53 if(L<=l && r<=R){return t[rt];} 54 int mid=(l+r)>>1; 55 node res1; 56 if(L<=mid)res1=query(L,R,l,mid,lc); 57 else res1=tmp0; 58 node res2; 59 if(R>mid)res2=query(L,R,mid+1,r,rc); 60 else res2=tmp0; 61 node res={0}; 62 res.smm=res1.smm+res2.smm; 63 res.mx=max(res1.mx,res2.mx); 64 res.mx=max(res.mx,res1.mr+res2.ml); 65 res.ml=max(res1.ml,res1.smm+res2.ml); 66 res.mr=max(res2.mr,res2.smm+res1.mr); 67 return res; 68 } 69 int main(){ 70 n=read();m=read(); 71 int i,j,x,y,k; 72 for(i=1;i<=n;i++)data[i]=read(); 73 Build(1,n,1); 74 tmp0.ml=tmp0.mr=tmp0.mx=-1e9;tmp0.smm=0; 75 for(i=1;i<=m;i++){ 76 k=read();x=read();y=read(); 77 if(k==1){ 78 if(x>y)swap(x,y); 79 printf("%d\n",query(x,y,1,n,1).mx); 80 } 81 else change(x,y,1,n,1); 82 } 83 return 0; 84 }
本文为博主原创文章,转载请注明出处。