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;
}

 

posted @ 2018-03-07 13:59  AKCqhzdy  阅读(120)  评论(0编辑  收藏  举报