链剖。。。这次的信息存在边上。。。
调了好久啊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 }