题目大意:

  有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和;2.将一条边的权值改为0.

思路:

  用dfs序将树化为序列,在dfs序中我们会保存节点i进入时间come[i]和出去时间leave[i],这两个数之间的区间即为其子树。询问实为前缀和,可用树状数组记录。修改只会影响其子树(即区间),其他部分并不会改变(+1-1抵消了)。

代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #define M 300000
  4. using namespace std;
  5.  
  6. int n,m,cnt,dfn,to[M],next[M],head[M],c[M],come[M],leave[M];
  7.  
  8. int read()
  9. {
  10. int x=,y=;
  11. char ch=getchar();
  12. while (ch<'' || ch>'') {if (ch=='-') y=-;ch=getchar();}
  13. while (ch>='' && ch<='') {x=x*+ch-;ch=getchar();}
  14. return x*y;
  15. }
  16.  
  17. void ins(int x,int y)
  18. {
  19. to[++cnt]=y,next[cnt]=head[x],head[x]=cnt;
  20. }
  21.  
  22. void dfs(int x)
  23. {
  24. come[x]=++dfn;
  25. for (int i=head[x];i;i=next[i]) dfs(to[i]);
  26. leave[x]=dfn;
  27. }
  28.  
  29. void add(int x,int y)
  30. {
  31. for (;x<=n;x+=x&-x) c[x]+=y;
  32. }
  33.  
  34. int sum(int x)
  35. {
  36. int ans=;
  37. for (;x;x-=x&-x) ans+=c[x];
  38. return ans;
  39. }
  40.  
  41. int main()
  42. {
  43. int i,j,x,y;
  44. n=read();
  45. for (i=;i<n;i++) x=read(),y=read(),ins(x,y);
  46. dfs();
  47. m=read();
  48. for (i=;i<=n;i++) add(come[i],),add(leave[i]+,-);
  49. for (i=;i<n+m;i++)
  50. {
  51. char ch=getchar();
  52. while (ch<'A' || ch>'Z') ch=getchar();
  53. if (ch=='W') printf("%d\n",sum(come[read()]));
  54. else x=read(),y=read(),add(come[y],-),add(leave[y]+,);
  55. } return ;
  56. }

BZOJ1103[POI2007]大都市meg 题解的更多相关文章

  1. bzoj1103: [POI2007]大都市meg(树链剖分)

    1103: [POI2007]大都市meg 题目:传送门 简要题意: 给你一棵树,给出每条边的权值,两个操作:1.询问根到编号x的最短路径的权值和  2.修改一条边的边权 题解: 很明显啊,看懂了题基 ...

  2. [bzoj1103][POI2007]大都市meg(树状数组+dfs序)

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2031  Solved: 1069[Submit][Sta ...

  3. BZOJ1103 [POI2007]大都市meg 【树剖】

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3038  Solved: 1593 [Submit][S ...

  4. bzoj1103: [POI2007]大都市meg

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1103 题目大意:在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Ma ...

  5. BZOJ1103 [POI2007]大都市meg dfs序 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...

  6. [BZOJ1103][POI2007]大都市meg dfs序+树状数组

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...

  7. BZOJ1103 [POI2007]大都市meg(DFS序)

    题目:一颗树,单边修改,链上查询..实际上链是根到结点的链.网上好像有其他做法,我的想法是这样的: 先不看修改,毫无疑问查询只是查询结点的深度:而修改一条边会有什么影响:影响是且只是以边上深度最深结点 ...

  8. 【dfs序】【树状数组】bzoj1103 [POI2007]大都市meg

    预处理出每个点到根节点的土路数,插到一个树状数组里,然后每次修改只会对子树中的节点造成影响,于是相当于区间修改.点查询了. #include<cstdio> using namespace ...

  9. 树状数组【bzoj1103】: [POI2007]大都市meg

    1103: [POI2007]大都市meg 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡 ...

随机推荐

  1. iOS 判断第一个字符是数字还是汉字

       NSString *titleStr = @"琳小兮";  //先截取字符串,拿到第一个字符         NSString *firstStr = [titleStr s ...

  2. Linux 标准目录结构

    初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...

  3. elementar OS体验

    关于其说明请参考https://linuxtoy.org/archives/elementary-os-luna.html

  4. android 入门-android Studio git配置

    以后在整理

  5. PHP二维数组去除重复,重复值相加

    $arr = array( array('id' => 122, 'name' => '张三', 'amount' => '1'), array('id' => 123, 'n ...

  6. Shell脚本获取C语言可执行程序返回值

    #!/bin/sh #./test是c程序,该程序 返回0 ./test OP_MODE=$? echo $OP_MODE # $? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误.

  7. HDU 5919 Sequence II 主席树

    Sequence II Problem Description   Mr. Frog has an integer sequence of length n, which can be denoted ...

  8. 德飞莱STM32单片机学习(一)——下载环境搭建

    一.下载驱动安装. 1.手动打开CH341 文件夹(驱动程序文件夹内) ,双击安装驱动 2. 尼莫M3S 开发硬件设置 硬件需要做到以下2 点:1. USB插入USB1(COM),打开电源开关J14( ...

  9. 分布式文件系统FastDFS设计原理(转)

    FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题 ...

  10. C#实现序列化和反序列化

    从我们面试准备上面,我知道了一个知识点,就是我们vs提供的序列化方法有两个,一个叫二进制序列化,一个叫做xml序列化,下面我们说一下二进制序列化的C#实现: 反序列化: public static T ...