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


  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793976.html
Copyright © 2011-2022 走看看