• poj3321 dfs+树状数组


        很早以前做的了,拿出来记录下。


    #include<stdio.h>

    #include<string.h>


    const int N=100001;
    struct Node
    {
    int v;
    struct Node *next;
    Node(int n=0,struct Node *P=NULL){v=n;next=P;}
    }node[N];


    struct Range{
    int b,e;
    }range[N];






    bool visited[N];
    int c[N];
    int n;


    void Dfs(int p,int &id);


    inline int Lowbit(int x){
    return x&(-x);
    }


    void Modify(int i,int v);


    int Sum(int n);








    int main()
    {
    while(scanf("%d",&n)!=EOF){
    int i,j;
    int a,b;
    int id;
    for(i=1;i<=n;i++)
    node[i].v=i;
    for(i=1;i<n;i++)
    {
    scanf("%d%d",&a,&b);
    node[a].next=new Node(b,node[a].next);
    node[b].next=new Node(a,node[b].next);
    }
    // memset(map,0,sizeof(map));
    // memset(c,0,sizeof(c));
    memset(visited,false,sizeof(visited));


    id=1;
    Dfs(1,id);
    for(i=1;i<=n;i++)Modify(range[i].b,1);


    int Q;
    scanf("%d",&Q);
    // scanf("%c",&ch);
    while(Q--){
    //scanf("%c",&ch);
    char ch;
    scanf("\n%c%d",&ch,&a);
    if(ch=='Q'){
    printf("%d\n",Sum(range[a].e)-Sum(range[a].b-1));
    }
    else{
    if(visited[range[a].b]){
    Modify(range[a].b,-1);
    visited[range[a].b]=false;
    }
    else{
    Modify(range[a].b,1);
    visited[range[a].b]=true;
    }
    }
    }//while(Q)
    }//while(EOF)
    return 0;
    }




    void Dfs(int i,int &id){
    visited[i]=true;
    range[i].b=id++;
    Node *p;
    for(p=node[i].next;p!=NULL;p=p->next){
    if(visited[p->v]==false)
    Dfs(p->v,id);
    }
    range[i].e=id-1;
    }






    void Modify(int index,int x){
    for(;index<N;c[index]+=x,index+=Lowbit(index));

    return ;
    }


    int Sum(int i){
    int s=0;
    for(;i>0;s+=c[i],i-=Lowbit(i));
    return s;
    }
  • 相关阅读:
    c++ 的几种强制转换的讨论
    观察者模式
    epoll实现linux进程通信
    vim 实现 go to definition的功能
    svn 的使用
    makefile文件的技术
    [转]epoll技术
    [转]poll技术
    Linux重定向的理解
    避免僵死进程的方法
  • 原文地址:https://www.cnblogs.com/bester/p/3255774.html
Copyright © 2020-2023  润新知