dfs序可以维护一个子树内的信息

需要记录dfs进的时间以及所有子树都遍历完的时间

  1. void dfs(int u, int fa)
  2. {
  3. L[u] = ++id;
  4. for(int i = head[u]; ~i; i = e[i].next)
  5. {
  6. int v = e[i].to;
  7. if(v == fa) continue;
  8. dfs(v, u);
  9. }
  10. R[u] = id;
  11. }

那么对于点i,L[i]到R[i]就是i的子树(包括i)

那么子树内维护信息就可以用树状数组,线段树之内的乱搞了。

poj 3321

用树状数组维护就好。

注意修改的时候一定是修改序列

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #define REP(i, a, b) for(register int i = (a); i < (b); i++)
  5. #define _for(i, a, b) for(register int i = (a); i <= (b); i++)
  6. using namespace std;
  7.  
  8. const int MAXN = 1e5 + ;
  9. struct Edge{ int to, next; };
  10. Edge e[MAXN << ];
  11. int head[MAXN], num, n, m;
  12. int L[MAXN], R[MAXN], s[MAXN], id;
  13.  
  14. struct Binary_Index_Tree
  15. {
  16. int f[MAXN];
  17.  
  18. Binary_Index_Tree() { memset(f, , sizeof(f)); }
  19.  
  20. int lowbit(int x) { return x & (-x); }
  21.  
  22. void add(int x, int p)
  23. {
  24. while(x <= n)
  25. {
  26. f[x] += p;
  27. x += lowbit(x);
  28. }
  29. }
  30.  
  31. int sum(int x)
  32. {
  33. int res = ;
  34. while(x)
  35. {
  36. res += f[x];
  37. x -= lowbit(x);
  38. }
  39. return res;
  40. }
  41.  
  42. int query(int l, int r) { return sum(r) - sum(l - ); }
  43. }S;
  44.  
  45. void read(int& x)
  46. {
  47. int f = ; x = ; char ch = getchar();
  48. while(!isdigit(ch)) { if(ch == '-') f = -; ch = getchar(); }
  49. while(isdigit(ch)) { x = x * + ch - ''; ch = getchar(); }
  50. x *= f;
  51. }
  52.  
  53. void AddEdge(int to, int from)
  54. {
  55. e[num] = Edge{to, head[from]};
  56. head[from] = num++;
  57. }
  58.  
  59. void dfs(int u, int fa)
  60. {
  61. L[u] = ++id;
  62. for(int i = head[u]; ~i; i = e[i].next)
  63. {
  64. int v = e[i].to;
  65. if(v == fa) continue;
  66. dfs(v, u);
  67. }
  68. R[u] = id;
  69. }
  70.  
  71. int main()
  72. {
  73. memset(head, -, sizeof(head)); num = ;
  74. read(n);
  75. REP(i, , n)
  76. {
  77. int u, v; read(u), read(v);
  78. AddEdge(u, v); AddEdge(v, u);
  79. }
  80. _for(i, , n)
  81. {
  82. s[i] = ;
  83. S.add(i, );
  84. }
  85.  
  86. dfs(, -);
  87. read(m);
  88.  
  89. while(m--)
  90. {
  91. char op[]; int x;
  92. scanf("%s", op); read(x);
  93. if(op[] == 'Q') printf("%d\n", S.query(L[x], R[x]));
  94. else
  95. {
  96. int id = L[x];
  97. if(s[id]) S.add(id, -);
  98. else S.add(id, );
  99. s[id] = !s[id];
  100. }
  101. }
  102.  
  103. return ;
  104. }

dfs序题集的更多相关文章

  1. 咸鱼的ACM之路:DFS水题集

    DFS的核心就是从一种状态出发,转向任意的一个可行状态,直到达到结束条件为止.(个人理解) 下面全是洛谷题,毕竟能找到测试点数据的OJ我就找到这一个....在其他OJ上直接各种玄学问题... P159 ...

  2. 【HDU4366】【DFS序+分块】Successor

    Problem Description Sean owns a company and he is the BOSS.The other Staff has one Superior.every st ...

  3. hdu6200 mustedge mustedge mustedge (并查集+dfs序树状数组)

    题意 给定一个n个点m条边无向图(n,m<=1e5) 支持两个操作 1.添加一条边 2.询问点u到点v的所有路径中必经边的条数 操作数<=1e5 分析 第一眼看起来像是要动态维护无向图的边 ...

  4. Codeforces 571D - Campus(并查集+线段树+DFS 序,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 看到集合的合并,可以本能地想到并查集. 不过这题的操作与传统意义上的并查集不太一样,传统意义上的并查集一般是用来判断连通性的,而此题还需支 ...

  5. 【做题】SDOI2017苹果树——dfs序的运用

    原文链接 https://www.cnblogs.com/cly-none/p/9845046.html 题意:给出一棵\(n\)个结点的树,在第\(i\)个结点上有\(a_i\)个权值为\(v_i\ ...

  6. BZOJ4699 树上的最短路(最短路径+dfs序+线段树+堆+并查集)

    首先一般化的将下水道和塌陷看成一个东西.注意到在从源点出发的所有需要使用某条下水道的最短路径中,该下水道只会被使用一次,该下水道第一个被访问的点相同,且只会在第一个访问的点使用该下水道.这个第一个访问 ...

  7. poj3321 dfs序+树状数组单点更新 好题!

    当初听郭炜老师讲时不是很懂,几个月内每次复习树状数组必看的题 树的dfs序映射在树状数组上进行单点修改,区间查询. /* 树状数组: lowbit[i] = i&-i C[i] = a[i-l ...

  8. BZOJ 4765 普通计算姬 dfs序+分块+树状数组+好题!!!

    真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记 ...

  9. 刷题总结——寻宝游戏(bzoj3991 dfs序)

    题目: Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄 ...

随机推荐

  1. oracle 创建自增主键

    1.创建表 create table Test_Increase( userid number(10) NOT NULL primary key, /*主键,自动增加*/ username varch ...

  2. [SharePoint2010开发入门经典]10、使用SPS2010构建面向服务的应用程序

    本章概要: 1.使用SPS自带的web service 2.构建自定义web service 3.使用不同的客户端解决方案部署自定义站点

  3. T4系列文章之2:T4工具简介、调试以及T4运行原理

    一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4有了一个大致的了解吧.现在,我们接着来讲一下T4的工具,然后下一篇我就开始T4的用法了.各位客官,就等了. 二.工具介绍 2.1 上图 ...

  4. 基本socket api

    socket函数,为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,并且指定通信协议类型. #include<sys/socket.h> int socket (int ...

  5. tomcat配置一个服务监听两个端口

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" ...

  6. 网易NAPM Andorid SDK实现原理--转

    原文地址:https://neyoufan.github.io/2017/03/10/android/NAPM%20Android%20SDK/ NAPM 是网易的应用性能管理平台,采用非侵入的方式获 ...

  7. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

  8. Asp.net Web Api中使用配置Unity

    第一步:建立web api,添加unity.webapi. 第二步:在添加了该引用之后,在App_Start中会自动生成UnityConfig.cs文件 第三步:添加数据做测试 第四步:展示效果

  9. java同步锁的正确使用

    同步锁分类 对象锁(this) 类锁(类的字节码文件对象即类名.class) 字符串锁(比较特别) 应用场景 在多线程下对共享资源的安全操作. 需求:启动5个线程对共享资源total进行安全操作. 同 ...

  10. Android 实现调用系统拍照相册,剪切功能

    1.XML布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...