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


  • 相关阅读:
    WEB功能测试说明
    年轻的采访可以学到很多东西
    金融系列11《电子现金应用》
    vs2010调用matlab2011下的.m文件
    使用VS2010调用matlab的mat格式文件
    matlab mex入门简介
    MEX文件编写和调试
    MAT文件操作
    8.Redis 数据备份与恢复
    JAVA_OPTS设置
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793976.html
Copyright © 2011-2022 走看看