链剖。。。这次的信息存在边上。。。

调了好久啊QAQ,没有看出连锁错误,对代码的敏感程度还是太差了,老是依赖debug(论NOIP为何会死得那么惨)

  1 #include<bits/stdc++.h>
  2 #define inc(i,l,r) for(int i=l;i<=r;i++)
  3 #define dec(i,l,r) for(int i=l;i>=r;i--)
  4 #define link(x) for(edge *j=h[x];j;j=j->next)
  5 #define mem(a) memset(a,0,sizeof(a))
  6 #define inf 1e10
  7 #define ll long long
  8 #define succ(x) (1<<x)
  9 #define NM 20000+5
 10 using namespace std;
 11 int read(){
 12     int x=0,f=1;char ch=getchar();
 13     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
 14     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
 15     return x*f;
 16 }
 17 struct edge{
 18     int t,v;
 19     edge *next;
 20 }e[2*NM],*h[NM],*p=e;
 21 void add(int x,int y,int v){
 22     p->t=y;p->v=v;p->next=h[x];h[x]=p;p++;
 23 }
 24 struct info{
 25     ll s,min,max,z;
 26 }T[8*NM],null,_t;
 27 info operator+(const info&x,const info&y){
 28     info f;
 29     f.s=x.s+y.s;
 30     f.max=max(x.max,y.max);
 31     f.min=min(x.min,y.min);
 32     f.z=0;
 33     return f;
 34 }
 35 int d[NM],f[NM],son[NM],id[NM],_id[NM],size[NM],top[NM],TOP,tot;
 36 int n,m,l,r,_x,_y,a[NM];
 37 char opt[5];
 38 void dfs1(int x){
 39     link(x)
 40     if(!f[j->t]){
 41         f[j->t]=x;
 42         d[j->t]=d[x]+1;
 43         a[j->t]=j->v;
 44         dfs1(j->t);
 45         size[x]+=size[j->t];
 46         if(size[j->t]>size[son[x]])son[x]=j->t;
 47     }
 48     size[x]++;
 49 }
 50 void dfs2(int x){
 51     top[x]=TOP;id[x]=++tot;_id[tot]=x;
 52     if(son[x])dfs2(son[x]);
 53     link(x)
 54     if(!top[j->t])dfs2(TOP=j->t);
 55 }
 56 void build(int i,int x,int y){
 57     int t=x+y>>1;
 58     if(x==y){
 59         T[i].s=T[i].min=T[i].max=a[_id[x]];
 60         return;
 61     }
 62     build(i<<1,x,t);build(i<<1|1,t+1,y);
 63     T[i]=T[i<<1]+T[i<<1|1];
 64 }
 65 void pushdown(int i){
 66     if(T[i].z){
 67         ll t=T[i<<1].max;
 68         T[i<<1].max=-T[i<<1].min;
 69         T[i<<1].min=-t;
 70         T[i<<1].s=-T[i<<1].s;
 71         t=T[i<<1|1].max;
 72         T[i<<1|1].max=-T[i<<1|1].min;
 73         T[i<<1|1].min=-t;
 74         T[i<<1|1].s=-T[i<<1|1].s;
 75         T[i<<1].z^=1;T[i<<1|1].z^=1;
 76         T[i].z=0;
 77     }
 78 }
 79 void ch(int i,int x,int y){
 80     int t=x+y>>1;
 81     if(x==y){
 82         T[i].s=T[i].max=T[i].min=_y;
 83         return;
 84     }
 85     pushdown(i);
 86     if(l<=t)ch(i<<1,x,t);else ch(i<<1|1,t+1,y);
 87     T[i]=T[i<<1]+T[i<<1|1];
 88 }
 89 void mod(int i,int x,int y){
 90     int t=x+y>>1;
 91     if(l<=x&&y<=r){
 92         T[i].s=-T[i].s;
 93         ll t=T[i].max;
 94         T[i].max=-T[i].min;
 95         T[i].min=-t;
 96         T[i].z^=1;
 97         return;
 98     }
 99     if(y<l||r<x)return;
100     pushdown(i);
101     mod(i<<1,x,t);mod(i<<1|1,t+1,y);
102     T[i]=T[i<<1]+T[i<<1|1];
103 }
104 info query(int i,int x,int y){
105     int t=x+y>>1;
106     if(l<=x&&y<=r)return T[i];
107     if(y<l||r<x)return null;
108     pushdown(i);
109     return query(i<<1,x,t)+query(i<<1|1,t+1,y);
110 }
111 int main(){
112     n=read();
113     inc(i,1,n-1){
114         _x=read()+1;_y=read()+1;int _t=read();
115         add(_x,_y,_t);add(_y,_x,_t);
116     }
117     f[1]=1;null.s=0;null.max=-inf;null.min=inf;
118     dfs1(1);
119     dfs2(TOP=1);
120     build(1,1,n);
121     m=read();
122     while(m--){
123         scanf("%s",opt);_x=read()+1;_y=read()+1;
124         if(opt[0]=='C'){
125             _y--;_x--;
126             if(d[e[2*_x-1].t]>d[e[2*_x-2].t])l=id[e[2*_x-1].t];
127             else l=id[e[2*_x-2].t];
128             ch(1,1,n);
129         }
130         else if(opt[0]=='N'){
131             for(;top[_x]!=top[_y];_x=f[top[_x]]){
132                 if(d[top[_x]]<d[top[_y]])swap(_x,_y);
133                 l=id[top[_x]];r=id[_x];
134                 mod(1,1,n);
135             }
136             if(d[_x]>d[_y])swap(_x,_y);
137             l=id[_x]+1;r=id[_y];
138             if(l<=r)mod(1,1,n);
139         }else{
140             _t=null;
141             for(;top[_x]!=top[_y];_x=f[top[_x]]){
142                 if(d[top[_x]]<d[top[_y]])swap(_x,_y);
143                 l=id[top[_x]];r=id[_x];
144                 _t=_t+query(1,1,n);
145             }
146             if(d[_x]>d[_y])swap(_x,_y);
147             l=id[_x]+1;r=id[_y];
148             _t=_t+query(1,1,n);
149             if(opt[0]=='S')printf("%lld\n",_t.s);
150             else if(opt[1]=='A')printf("%lld\n",_t.max);
151             else printf("%lld\n",_t.min);
152         }
153     }
154     return 0;
155 }
View Code

 

posted on 2015-12-15 21:25  onlyRP  阅读(159)  评论(0编辑  收藏  举报