POJ 3321 dfs序+树状数组

来源:互联网 发布:mac系统剪切文件 编辑:程序博客网 时间:2024/05/29 07:10

这题真的很迷,那个vectorE[maxn]就是过不了,改成vector

#include<iostream>#include<cstdio>#include<vector>#include<cstring>using namespace std;typedef long long LL;const int maxn=100005;int N,M,tot;int L[maxn],R[maxn];int c[maxn];vector<vector<int> >E(maxn);int vis[maxn];char s[4];int tmp;void dfs(int x){    L[x]=tot;    for(int i=0;i<E[x].size();i++){        tot++;        int to=E[x][i];        dfs(to);    }    R[x]=tot;}int lowbit(int x) //求最低位1的位置所表示的数{    return x&(-x);}void update(int p,int q)// 单点更新c[p] 加上q{                        //    (其中k为x二进制末尾0的个数)    while(p<=N)    {        c[p]+=q;        p+=lowbit(p);    }}int S(int x)  //S(i)表示的是的前i个数的和{    int sum=0;    while(x>0)    {        sum+=c[x];        x-=lowbit(x);    }    return sum;}void init(){    for(int i=1;i<=N;i++){        vis[i]=1;        update(i,1);    }    tot=1;}int main(){    scanf("%d",&N);    init();    for(int i=1;i<=N-1;i++){        int u,v;        scanf("%d%d",&u,&v);        E[u].push_back(v);    }    dfs(1);    scanf("%d",&M);    while(M--){        scanf("%s%d",s,&tmp);        if(s[0]=='Q'){            printf("%d\n",S(R[tmp])-S(L[tmp]-1));        }        else {            if(vis[tmp]){                update(L[tmp],-1);            }            else {                update(L[tmp],1);            }            vis[tmp]=!vis[tmp];        }    }    return 0;}
0 0
原创粉丝点击