【树状数组,邻接表dfs遍历】POJ 3321 Apple Tree

链接

http://poj.org/problem?id=3321

大意

在一棵多叉树上有 n n 个节点,起初每个节点上都有一个苹果,中间会有两种操作:

  1. 询问以x为根的子树共有几个苹果

    • 改变 x x <script type="math/tex" id="MathJax-Element-117">x</script>号节点上的苹果,其苹果树取反(即0为1,1为0)
    • 思路

      其实这题我是想用线段树的。。。
      树状数组+邻接表dfs遍历
      就是利用dfs化树为链,然后就是基本的树状数组啦

      代码

      #include<cstdio>
      #include<cstring>
      #define maxn 100001
      #define make(a,b) memset(a,b,sizeof(a))//其实这并没有什么卵用
      #define lb i&-i//lowbit
      using namespace std;int tot,n,x,y,m,q;char ch;
      struct node
      {
          int to,next;
      }edge[2*maxn];
      int l[maxn],c[maxn],begin[maxn],end[maxn];//一堆数组
      bool apple[maxn];
      void add(int u,int v)//建图
      {
          edge[++tot].to=v;
          edge[tot].next=l[u];
          l[u]=tot;
      }
      void dfs(int k)//遍历
      {
          begin[k]=m;
          for(int i=l[k];i;i=edge[i].next) dfs(edge[i].to);
          end[k]=++m;
      }
      void upd(int i,int d){for(;i<=n;i+=lb) c[i]+=d;return;}//更改
      int sum(int i){int t=0;for(;i>0;i-=lb) t+=c[i];return t;}//求和
      int main()
      {
          scanf("%d",&n);
          for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add(x,y);//建图
          dfs(1);//遍历
          for(int i=1;i<=n;i++) upd(i,1);//初始化每棵树上都有苹果
          scanf("%d",&q);
          while(q--)
          {
              while((ch=getchar())!='C'&&ch!='Q');scanf("%d",&x);//输入
              if(ch=='C')
              {
                  apple[x]^=1;
                  if(apple[x]) upd(end[x],-1);//减掉
                  else upd(end[x],1);//加回
              }
              else
              printf("%d\n",sum(end[x])-sum(begin[x]));//计算
          }
      }
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值