codeforces772C

给一段序列,给你去掉所有数字的顺序,输出每去掉一个数,当前联通的子序列的最大值。

倒着来,每次插入一个数,然后求联通的最大值,线段树每个节点标记一下,区间的左右是否插入了数字,还有如果有数字从左边/右边开始连续子序列的值,还有这个节点的区间是否连续。

  1 #include <cstdio>
  2 
  3 #include <algorithm>
  4 
  5 using namespace std;
  6 
  7 typedef long long LL;
  8 
  9 const int maxn=100000;
 10 
 11 int n;
 12 
 13 int i;
 14 
 15 int a[maxn+10];
 16 
 17 int b[maxn+10];
 18 
 19 LL res[maxn+10];
 20 
 21 struct node{
 22     int l,r;
 23     LL sum;
 24     int lflag,rflag;
 25     LL lval,rval;
 26     bool f;
 27 }tree[maxn*4+10];
 28 
 29 void push_up(int id){
 30    int llf=tree[id<<1].lflag;
 31    int lrf=tree[id<<1].rflag;
 32    int rlf=tree[(id<<1)+1].lflag;
 33    int rrf=tree[(id<<1)+1].rflag;
 34    if(lrf&&rlf){
 35       tree[id].sum=max(max(tree[id<<1].rval+tree[(id<<1)+1].lval,tree[id<<1].sum),tree[(id<<1)+1].sum);
 36       tree[id].lflag=llf;
 37       tree[id].rflag=rrf;
 38       if(llf){
 39       if(tree[id<<1].f)
 40       tree[id].lval=tree[id<<1].lval+tree[(id<<1)+1].lval;
 41       else tree[id].lval=tree[id<<1].lval;
 42       } else {
 43           tree[id].lval=0;
 44       }
 45       if(rrf){
 46       if(tree[(id<<1)+1].f){
 47       tree[id].rval=tree[(id<<1)].rval+tree[(id<<1)+1].rval;
 48       }
 49       else tree[id].rval=tree[(id<<1)+1].rval;
 50       } else {
 51          tree[id].rval=0;
 52       }
 53       tree[id].f=tree[(id<<1)].f&&tree[(id<<1)+1].f;
 54    }else if(!lrf||!rlf){
 55       if(tree[id<<1].sum>tree[(id<<1)+1].sum){
 56             tree[id].sum=tree[id<<1].sum;
 57             tree[id].lflag=llf;
 58             tree[id].rflag=rrf;
 59             if(!llf)
 60             tree[id].lval=0;
 61             else tree[id].lval=tree[id<<1].lval;
 62             if(!rrf)
 63             tree[id].rval=0;
 64             else
 65             tree[id].rval=tree[(id<<1)+1].rval;
 66             tree[id].f=0;
 67       } else if(tree[id<<1].sum<tree[(id<<1)+1].sum){
 68              tree[id].sum=tree[(id<<1)+1].sum;
 69              tree[id].lflag=llf;
 70              tree[id].rflag=rrf;
 71              if(!llf)
 72              tree[id].lval=0;
 73              else tree[id].lval=tree[id<<1].lval;
 74              if(!rrf)
 75              tree[id].rval=0;
 76              else
 77              tree[id].rval=tree[(id<<1)+1].rval;
 78              tree[id].f=0;
 79       } else if(tree[id<<1].sum==tree[(id<<1)+1].sum){
 80              tree[id].sum=tree[id<<1].sum;
 81              tree[id].lflag=llf;
 82              tree[id].rflag=rrf;
 83              if(!llf)
 84              tree[id].lval=0;
 85              else tree[id].lval=tree[id<<1].lval;
 86              if(!rrf)
 87              tree[id].rval=0;
 88              else
 89              tree[id].rval=tree[(id<<1)+1].rval;
 90              tree[id].f=0;
 91       }
 92 
 93    }
 94 }
 95 
 96 void build(int id,int l,int r){
 97      if(l==r){
 98        tree[id].l=tree[id].r=l;
 99        tree[id].sum=0;
100        tree[id].lflag=tree[id].rflag=0;
101        tree[id].lval=tree[id].rval=0;
102        tree[id].f=0;
103        return ;
104      }
105      int mid=(l+r)>>1;
106      build(id<<1,l,mid);
107      build((id<<1)+1,mid+1,r);
108      push_up(id);
109 }
110 
111 void update(int id,int l,int r,int x,int val){
112         if(l==r){
113         tree[id].sum+=(LL)val;
114         tree[id].lflag=tree[id].rflag=1;
115         tree[id].lval=tree[id].rval=val;
116         tree[id].f=1;
117         return ;
118      }
119      int mid=(l+r)>>1;
120      if(x<=mid){
121        update(id<<1,l,mid,x,val);
122      } else {
123        update((id<<1)+1,mid+1,r,x,val);
124      }
125      push_up(id);
126 }
127 
128 int main()
129 {
130     scanf("%d",&n);
131     build(1,1,n);
132     for(i=1;i<=n;i++){
133         scanf("%d",&a[i]);
134     }
135     for(i=1;i<=n;i++){
136         scanf("%d",&b[i]);
137     }
138     for(i=n;i>=2;i--){
139           update(1,1,n,b[i],a[b[i]]);
140           res[i]=tree[1].sum;
141     }
142     for(int i=2;i<=n+1;i++){
143        printf("%I64d\n",res[i]);
144     }
145     return 0;
146 }
View Code

 

posted @ 2016-10-03 16:23  GeniusYang  阅读(264)  评论(0编辑  收藏  举报