1103: [POI2007]大都市meg
dfs序+差分+树状数组。这题很简单。
但是要注意dfs新编号的问题。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; struct node { int x,y,next; }a[510000];int len,last[310000]; void ins(int x,int y) { len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len; } int dep[310000],z,l[310000],r[310000]; void dfs(int x,int f) { l[x]=++z; dep[l[x]]=dep[l[f]]+1; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(y!=f) dfs(y,x); } r[x]=z; } int n,s[310000]; int lowbit(int x){return x&-x;} void change(int x,int k) { while(x<=n) { s[x]+=k; x+=lowbit(x); } } int getsum(int x) { int ret=0; while(x>=1) { ret+=s[x]; x-=lowbit(x); } return ret; } char ss[10]; int main() { scanf("%d",&n); int x,y; len=0;memset(last,0,sizeof(last)); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); ins(x,y);ins(y,x); } dep[0]=-1;dfs(1,0); dep[0]=0;for(int i=1;i<=n;i++)change(i,dep[i]-dep[i-1]); int m; scanf("%d",&m);m=n+m-1; while(m--) { scanf("%s",ss+1); if(ss[1]=='A') { scanf("%d%d",&x,&y); if(dep[l[x]]<dep[l[y]])swap(x,y); change(l[x],-1);change(r[x]+1,1); } else { scanf("%d",&x); printf("%d\n",getsum(l[x])); } } return 0; }
pain and happy in the cruel world.