NOI十连测 第六测 T1

 

 思路:

用treap动态维护,记一个sum1,sum2,注意!,写treap如果有删除操作,千万不能把权值相同的分开来。。,这在删除的时候会进入死循环,这是一个惨痛的教训。。。

  1 #include<cstdio>
  2 #include<cmath>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<time.h>
  7 #define ll long long
  8 struct edge{
  9     int u,v;
 10     ll w;
 11 }e[2000005];
 12 struct node{
 13     int l,r,rnd,size,w;
 14     ll v,sum1,sum2;
 15 }t[2000005];
 16 ll val[2000005];
 17 int tot,n,q,sz,vis[2000005],root;
 18 int read(){
 19     int t=0,f=1;char ch=getchar();
 20     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
 21     while ('0'<=ch&&ch<='9') {t=t*10+ch-'0';ch=getchar();}
 22     return t*f;
 23 }
 24 ll Read(){
 25     ll t=0,f=1;char ch=getchar();
 26     while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
 27     while ('0'<=ch&&ch<='9') {t=t*10+ch-'0';ch=getchar();}
 28     return t*f;
 29 }
 30 void updata(int k){
 31     int l=t[k].l,r=t[k].r;
 32     t[k].size=t[l].size+t[r].size+t[k].w;
 33     int num1,num2;
 34     if (t[k].w%2==0) num1=num2=t[k].w/2;
 35     else num2=t[k].w/2,num1=num2+1;
 36     int Num=0;
 37     if (l==0&&r==0){
 38         t[k].sum1=num1*t[k].v;
 39         t[k].sum2=num2*t[k].v;
 40         return;
 41     }else
 42     if (r==0&&l!=0){
 43         t[k].sum1=t[l].sum1;
 44         t[k].sum2=t[l].sum2;
 45         if (t[l].size%2) t[k].sum2+=t[k].v*num1,t[k].sum1+=t[k].v*num2;
 46         else t[k].sum1+=t[k].v*num1,t[k].sum2+=t[k].v*num2;
 47         return;
 48     }else
 49     if (l==0&&r!=0){
 50         t[k].sum1=t[k].v*num1;
 51         t[k].sum2=t[k].v*num2;
 52         if (t[k].w%2) t[k].sum2+=t[r].sum1,t[k].sum1+=t[r].sum2;
 53         else t[k].sum1+=t[r].sum1,t[k].sum2+=t[r].sum2;
 54         return;
 55     }
 56     t[k].sum1=t[l].sum1;Num=t[l].size;
 57     t[k].sum2=t[l].sum2;
 58     if (Num%2){
 59         t[k].sum2+=t[k].v*num1;
 60         t[k].sum1+=t[k].v*num2;
 61     }else{
 62         t[k].sum2+=t[k].v*num2;
 63         t[k].sum1+=t[k].v*num1;
 64     }
 65     Num+=t[k].w;
 66     if (Num%2){
 67         t[k].sum2+=t[r].sum1;
 68         t[k].sum1+=t[r].sum2;
 69     }else{
 70         t[k].sum1+=t[r].sum1;
 71         t[k].sum2+=t[r].sum2;
 72     }
 73 }
 74 void lturn(int &k){int T=t[k].r;t[k].r=t[T].l;t[T].l=k;t[T].size=t[k].size;updata(k);updata(T);k=T;}
 75 void rturn(int &k){int T=t[k].l;t[k].l=t[T].r;t[T].r=k;t[T].size=t[k].size;updata(k);updata(T);k=T;}
 76 void insert(int &k,int v){
 77     if (!k){
 78         k=++sz;
 79         t[k].l=t[k].r=0;
 80         t[k].rnd=rand();
 81         t[k].size=1;
 82         t[k].w=1;
 83         t[k].v=v;
 84         t[k].sum1=v;
 85         t[k].sum2=0;
 86         return;
 87     }
 88     t[k].size++;
 89     if (t[k].v==v){
 90         t[k].w++;
 91         updata(k);
 92         return;
 93     }
 94     else
 95     if (t[k].v>v){
 96         insert(t[k].r,v);
 97         if (t[t[k].r].rnd<t[k].rnd) lturn(k);
 98     }else{
 99         insert(t[k].l,v);
100         if (t[t[k].l].rnd<t[k].rnd) rturn(k);
101     }
102     updata(k);
103 }
104 void del(int &k,int v){
105     if (!k) return;
106     if (t[k].v==v){
107         if (t[k].w>1){
108             t[k].w--;
109             updata(k);
110             return;
111         }
112         if (t[k].l==0||t[k].r==0){
113             k=t[k].l+t[k].r;
114             return;
115         }
116         if (t[t[k].l].rnd<t[t[k].r].rnd){
117             rturn(k);
118             del(k,v);
119         }else{
120             lturn(k);
121             del(k,v);
122         }
123         updata(k);
124         return;
125     }
126     t[k].size--;
127     if (t[k].v>v){
128         del(t[k].r,v);
129     }else{
130         del(t[k].l,v);
131     }
132     updata(k);
133 }
134 int main(){
135     n=read();q=read();int o=read();ll ans=0;
136     while (q--){
137         int opt=read();
138         if (opt==1){
139             e[++tot].u=read();e[tot].v=read();e[tot].w=Read();
140             e[tot].u^=(o*ans);e[tot].v^=(o*ans);
141             if (val[e[tot].u]) del(root,val[e[tot].u]);vis[e[tot].u]=1;
142             if (val[e[tot].v]&&e[tot].u!=e[tot].v) del(root,val[e[tot].v]);vis[e[tot].v]=1;
143             val[e[tot].u]+=e[tot].w;
144             val[e[tot].v]+=e[tot].w;
145             insert(root,val[e[tot].u]);
146             if (e[tot].u!=e[tot].v)
147             insert(root,val[e[tot].v]);    
148             ans=(t[root].sum1-t[root].sum2)/2;
149             printf("%lld\n",ans);    
150         }else{
151             int k=read();
152             k=k^(o*ans);
153             if (val[e[k].u])
154             del(root,val[e[k].u]);
155             if (val[e[k].v]&&e[k].u!=e[k].v)
156             del(root,val[e[k].v]);
157             val[e[k].u]-=e[k].w;
158             val[e[k].v]-=e[k].w;
159             if (val[e[k].u]!=0)
160             insert(root,val[e[k].u]);
161             if (val[e[k].v]!=0&&e[k].u!=e[k].v)
162             insert(root,val[e[k].v]);
163             ans=(t[root].sum1-t[root].sum2)/2;
164             printf("%lld\n",ans);
165         }
166     }
167     return 0;
168 }

 

posted @ 2016-06-22 17:40  GFY  阅读(157)  评论(0编辑  收藏  举报