bzoj2631: tree lct

要打mul和add的lct

50000+的mod用unsigned int好了TAT

(坑爹没打pc('\n');(静态)调了好久,样例竟然只输出一个,orz,也不提示PE T_T)

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #include<algorithm>
  5 #include<cstdio>
  6 
  7 using namespace std;
  8 
  9 const int D=15000000;
 10 char in[D],out[100010*10],*I=in,*O=out;
 11 #define gc (*I++)
 12 #define pc(x) ((*O++)=x)
 13 template <typename Q> 
 14 void gt(Q&x) {
 15     static char c,f;
 16     for(c=gc,f=0;!isdigit(c);c=gc)if(c=='-') f=1;
 17     for(x=0;isdigit(c);c=gc) x=x*10+c-'0';
 18     f && (x=-x);
 19 }
 20 template <typename Q>
 21 void pt(Q x){
 22     static char stk[20];
 23     static int top;
 24     top=0;
 25     if(x==0) pc('0');
 26     for(;x;x/=10) stk[++top] = x%10+'0';
 27     for(;top;top--) pc(stk[top]);
 28 }
 29 
 30 typedef unsigned ll;
 31 const int Maxn=100010,Mod=51061;
 32 int n,m;
 33 ll w[Maxn],tagm[Maxn],taga[Maxn],sz[Maxn];
 34 int ch[Maxn][2],p[Maxn],flip[Maxn],sum[Maxn];
 35 
 36 void update(int x){
 37     if(x==0) return;
 38     int&l=ch[x][0],&r=ch[x][1];
 39     sum[x] = (sum[l] + sum[r] + w[x])%Mod;
 40     sz[x] = (sz[l] + sz[r] + 1)%Mod;
 41 }
 42 
 43 void add_tag(int x,ll a,ll m){
 44     if(!x) return;
 45     sum[x] = (sum[x]*m+a*sz[x])%Mod;
 46     w[x] = (w[x]*m+a)%Mod;
 47     tagm[x] = tagm[x]*m%Mod;
 48     taga[x] = (taga[x]*m+a)%Mod;
 49 }
 50 
 51 /*void tag_mul(int x,ll _v) {
 52     (sum[x]*=_v)%=Mod;
 53     (w[x]*=_v)%=Mod;
 54     (tagm[x]*=_v)%=Mod;
 55     (taga[x]*=_v)%=Mod;
 56 }
 57 
 58 void tag_add(int x,ll _v) {
 59     (sum[x]+=(sz[x]*_v)%Mod)%=Mod;
 60     (w[x]+=_v)%=Mod;
 61     (taga[x]+=_v)%=Mod;
 62 }*/
 63 
 64 bool isroot(int x) {
 65     return ch[p[x]][0]!=x && ch[p[x]][1]!=x;
 66 }
 67 
 68 void down(int x) {
 69     int &l=ch[x][0],&r=ch[x][1];
 70     if(flip[x]) {
 71         swap(l,r);
 72         flip[l]^=1;
 73         flip[r]^=1;
 74         flip[x]=0;
 75     }
 76     /*if(tagm[x]!=1) {
 77         for(int i=0;i<2;i++)if(ch[x][i])tag_mul(ch[x][i],tagm[x]);
 78         tagm[x]=1;
 79     }
 80     if(taga[x]!=0) {
 81         for(int i=0;i<2;i++)if(ch[x][i])tag_add(ch[x][i],taga[x]);
 82         taga[x]=0;
 83     }*/
 84     ll&a=taga[x],&m=tagm[x];
 85     if(a!=0 || m!=1) {
 86         add_tag(l,a,m);
 87         add_tag(r,a,m);
 88         a=0;m=1;
 89     }
 90 }
 91 
 92 void rotate(int x){
 93     int y=p[x],z=p[y];
 94     int l=ch[y][1]==x,r=l^1;
 95     if(!isroot(y)){
 96         ch[z][ch[z][1]==y]=x;
 97     }
 98     p[y]=x;
 99     p[ch[x][r]]=y;
100     p[x]=z;
101     
102     ch[y][l]=ch[x][r];
103     ch[x][r]=y;
104     
105     update(y);
106 //    update(x);
107 }
108 
109 int stk[Maxn],top;
110 void splay(int x){
111     stk[top=1]=x;
112     for(int t=x;!isroot(t);stk[++top]=t=p[t]);
113     for(;top;top--) down(stk[top]);
114     for(;!isroot(x);){
115         int y=p[x],z=p[y];
116         if(!isroot(y)) {
117             if( (ch[y][0]==x) ^ (ch[z][0]==y)) rotate(x);
118             else rotate(y);
119         }
120         rotate(x);
121     }
122     update(x);
123 }
124 
125 void access(int x) {
126     for(int t=0;x;x=p[t=x]){
127         splay(x);
128         ch[x][1]=t;
129         update(x);
130     }
131 }
132 
133 void newroot(int x) {
134     access(x);
135     splay(x);
136     flip[x]^=1;
137 }
138 
139 inline void n_as(int u,int v){
140     newroot(u);
141     access(v);
142     splay(v);
143 }
144 
145 void Cut(int x,int y) {
146     n_as(x,y);
147     ch[y][0]=p[x]=0;
148     update(x);
149 }
150 
151 void Link(int x,int y) {
152     newroot(x);
153     p[x]=y;
154 }
155 
156 int en[Maxn*2],next[Maxn*2],fir[Maxn];
157 void Add(int from,int to) {
158     static int tot=0;
159     en[++tot]=to;
160     next[tot]=fir[from];
161     fir[from]=tot;
162 }
163 
164 void BFS(int u) {
165     int *q=stk,ql=0,qr=0;
166     q[++qr]=u;
167     for(int x;ql<qr;){
168         x=q[++ql];
169         for(int k=fir[x];k;k=next[k]){
170             int v=en[k];
171             if(v==p[x]) continue;
172             p[v]=x;
173             q[++qr]=v;
174         }
175     }
176 }
177         
178 void init(){
179     gt(n),gt(m);
180     for(int u,v,i=1;i<n;i++) {
181         gt(u),gt(v);
182 //        Add(u,v),Add(v,u);
183         Link(u,v);
184     }
185 //    BFS(1);
186     tagm[0]=1;
187     for(int i=1;i<=n;i++) sz[i]=sum[i]=tagm[i]=w[i]=1;
188 }
189 
190 void work() {
191     char c;
192     ll u,v,d;
193     /*printf("round%d:\n",0);
194         for(int i=1;i<=n;i++) {
195             printf("%d :p=%d,ch=(%d,%d),w=%d,taga=%d,tagm=%d\n",i,p[i],ch[i][0],ch[i][1],w[i],taga[i],tagm[i]);
196         }*/
197     for(int i=1;i<=m;i++) {
198         for(;;) {
199             c=gc;
200             if(c=='+') {
201                 gt(u),gt(v),gt(d);
202                 n_as(u,v);
203 //                tag_add(v,d);
204                 add_tag(v,d,1);
205                 break;
206             }if(c=='-') {
207                 gt(u),gt(v);
208                 Cut(u,v);
209                 gt(u),gt(v);
210                 Link(u,v);
211                 break;
212             }if(c=='*') {
213                 gt(u),gt(v),gt(d);
214                 n_as(u,v);
215                 add_tag(v,0,d);
216 //                tag_mul(v,d);
217                 break;
218             }if(c=='/'){
219                 gt(u),gt(v);
220                 n_as(u,v);
221                 pt(sum[v]);
222                 pc('\n');
223                 break;
224             }
225         }
226         /*printf("round%d:\n",i);
227         for(int i=1;i<=n;i++) {
228             printf("%d :p=%d,ch=(%d,%d),w=%d,taga=%d,tagm=%d,sum=%d\n",i,p[i],ch[i][0],ch[i][1],w[i],taga[i],tagm[i],sum[i]);
229         }*/
230     }
231 }
232 
233 int main() {
234 #ifdef DEBUG
235     freopen("in.txt","r",stdin);
236 //    freopen("out.txt","w",stdout);
237 #endif
238     fread(in,1,D,stdin);
239     
240     init();
241     work();
242     
243     return printf(out),0;
244 }

 

posted @ 2015-05-11 23:24  Showson  阅读(250)  评论(0编辑  收藏  举报