zoukankan      html  css  js  c++  java
  • 【POJ3321】Apple Tree-DFS+树状数组维护

    题目大意:有一棵树有n个节点,刚开始每个节点的权值都为1,有两种操作:1.修改某一个节点的权值,把1修改成0,把0修改成1。2.询问以某一个节点为根的子树上的点的权值之和。对于每一个询问,给出正确的答案。

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,m,tot,first[100010]={0},c[100010]={0};
    int begin[100010]={0},end[100010]={0};
    bool v[100010]={0};
    struct edge
    {
      int v,next;
    }e[200010];
    
    void insert(int a,int b)
    {
      e[++tot].v=b;
      e[tot].next=first[a];
      first[a]=tot;
    }
    
    void dfs(int x)
    {
      v[x]=1;
      begin[x]=tot;
      for(int i=first[x];i>0;i=e[i].next)
        if (!v[e[i].v]) {++tot;dfs(e[i].v);}
      end[x]=tot;
    }
    
    int lowbit(int i)
    {
      return i&(-i);
    }
    
    void add(int x,int a)
    {
      for(int i=x;i<=n;i+=lowbit(i))
        c[i]+=a;
    }
    
    int sum(int x)
    {
      int s=0;
      for(int i=x;i>0;i-=lowbit(i))
        s+=c[i];
      return s;
    }
    
    int main()
    {
      scanf("%d",&n);
      for(int i=1;i<n;i++)
      {
        int a,b;
    	scanf("%d %d",&a,&b);
    	insert(a,b);insert(b,a);
      }
      for(int i=1;i<=n;i++) add(i,1);
      
      tot=1;
      dfs(1);
      
      scanf("%d
    ",&m);
      for(int i=1;i<=m;i++)
      {
        char op;int p;
        scanf("%c %d
    ",&op,&p);
    	if (op=='C')
    	{
    	  int s=sum(begin[p])-sum(begin[p]-1);
    	  if (s) add(begin[p],-1);
    	  else add(begin[p],1);
    	}
    	else printf("%d
    ",sum(end[p])-sum(begin[p]-1));
      }
      
      return 0;
    }
    


  • 相关阅读:
    python wsdl connection refused 111
    我要学算法
    linux 定时任务
    mysql语句
    Firefox配置Fiddler
    windows下安装spynner
    做一个完整的项目需要技能
    快速排序
    《实时控制软件设计》总结
    asp实现在微信jsdk分享从a页面跳转到b页面然后分享后点开又回a页面
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793975.html
Copyright © 2011-2022 走看看