蒟蒻的树链剖分代码,一直31分,不知错哪里?求助路过神犇!——初二党的一个蒟蒻
原题:P3038
#include<bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
const int N=100005;
int n,m,a,b;
char c;
int head[N],tot;
struct edge{
int next,to;
}g[N*2];
struct node{
int sum,lazy;
}xds[N<<2];
void add(int u,int v){
g[++tot].next=head[u];
g[tot].to=v;
head[u]=tot;
}
int top[N],size[N],deep[N],f[N],id[N],son[N];
void DFS1(int u,int fa){
deep[u]=deep[fa]+1;
f[u]=fa;
size[u]=1;
for(int i=head[u];~i;i=g[i].next){
if(g[i].to==f[u]) continue;
DFS1(g[i].to,u);
size[u]+=size[g[i].to];
if(!son[u]||size[son[u]]<size[g[i].to]) son[u]=g[i].to;
}
return;
}
int dfnum;
void DFS2(int u,int topu){
id[u]=++dfnum;
top[u]=topu;
if(!son[u]) return;
DFS2(son[u],topu);
for(int i=head[u];~i;i=g[i].next){
int v=g[i].to;
if(v==f[u]||v==son[u]) continue;
DFS2(v,v);
}
}
void pushdown(int k,int l,int r){
if(!xds[k].lazy) return;
xds[k<<1].lazy++;xds[k<<1|1].lazy++;
xds[k<<1].sum+=(mid-l+1);xds[k<<1|1].sum+=(r-mid);
xds[k].lazy=0;
}
void Modify(int l,int r,int ll,int rr,int k){
if(l>=ll&&r<=rr){
xds[k].lazy++;xds[k].sum+=(r-l+1);
return;
}
pushdown(k,l,r);
if(ll<=mid) Modify(l,mid,ll,rr,k<<1);
if(rr>mid) Modify(mid+1,r,ll,rr,k<<1|1);
xds[k].sum=xds[k<<1].sum+xds[k<<1|1].sum;
}
int Query(int l,int r,int z,int k){
if(l==r) return xds[k].sum;
pushdown(k,l,r);
if(z<=mid) return Query(l,mid,z,k<<1);
if(z>mid) return Query(mid+1,r,z,k<<1|1);
}
void UpdataLink(int u,int v){
while(top[u]!=top[v]){
if(deep[top[u]]<deep[top[v]]) swap(u,v);
Modify(1,n,id[top[u]],id[u],1);
u=f[top[u]];
}
if(deep[u]>deep[v]) swap(u,v);
if(u!=v) Modify(1,n,id[u]+1,id[v],1);
}
int main(){
// freopen("P3038_2.in","r",stdin);
// freopen("P3038_my.out","w",stdout);
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
DFS1(1,0);
DFS2(1,1);
while(m--){
scanf("%s%d%d",&c,&a,&b);
if(c=='P') UpdataLink(a,b);
else if(c=='Q'){
int t=b;
if(deep[a]>deep[b]) t=a;
printf("%d\n",Query(1,n,id[t],1));
}
}
return 0;
}
Orz