NOI十连测 第六测 T1
Posted GFY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于NOI十连测 第六测 T1的主要内容,如果未能解决你的问题,请参考以下文章