DFS序可以把树转到区间上再用高级数据结构维护,比树链剖分好理解很多

一个闭区间就是一棵子树

POJ3321

  1. #include<cstdio>
  2. const int maxn=;
  3. const int maxm=;
  4. int n,m,id,cnt;
  5. int g[maxn],q[maxn],st[maxn],ed[maxn];
  6. int lch[],rch[],sum[];
  7. struct Edge
  8. {
  9. int t,next;
  10. }e[maxm];
  11. void insert(int u,int v)
  12. {
  13. ++cnt;e[cnt].t=v;e[cnt].next=g[u];g[u]=cnt;
  14. ++cnt;e[cnt].t=u;e[cnt].next=g[v];g[v]=cnt;
  15. }
  16. void dfs(int x,int fa)
  17. {
  18. q[++id]=x;
  19. st[x]=id;
  20. for(int tmp=g[x];tmp;tmp=e[tmp].next)
  21. if(e[tmp].t!=fa) dfs(e[tmp].t,x);
  22. ed[x]=id;
  23. }
  24. void build(int k,int l,int r)
  25. {
  26. int mid=(l+r)>>;
  27. lch[k]=l;rch[k]=r;
  28. if(l==r)
  29. {
  30. sum[k]=;
  31. return;
  32. }
  33. build(k<<,l,mid);
  34. build(k<<|,mid+,r);
  35. sum[k]=sum[k<<]+sum[k<<|];
  36. }
  37. int query(int k,int a,int b)
  38. {
  39. int l=lch[k],r=rch[k],mid=(l+r)>>;
  40. if(l==a&&r==b) return sum[k];
  41. if(b<=mid) return query(k<<,a,b);
  42. else if(a>mid) return query(k<<|,a,b);
  43. else return query(k<<,a,mid)+query(k<<|,mid+,b);
  44. }
  45. void modify(int k,int x)
  46. {
  47. int l=lch[k],r=rch[k],mid=(l+r)>>;
  48. if(l==r)
  49. {
  50. sum[k]^=;
  51. return;
  52. }
  53. if(x<=mid) modify(k<<,x);
  54. else modify(k<<|,x);
  55. sum[k]=sum[k<<]+sum[k<<|];
  56. }
  57. long long read()
  58. {
  59. long long x=,f=;char ch=getchar();
  60. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  61. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  62. return x*f;
  63. }
  64. int main()
  65. {
  66. n=read();
  67. for(int i=;i<n;i++)
  68. {
  69. int u=read(),v=read();
  70. insert(u,v);
  71. }
  72. dfs(,);
  73. m=read();
  74. char ch[];
  75. build(,,n);
  76. for(int i=;i<=m;i++)
  77. {
  78. scanf("%s",ch+);
  79. int x=read();
  80. if(ch[]=='Q') printf("%d\n",query(,st[x],ed[x]));
  81. else modify(,st[x]);
  82. }
  83. return ;
  84. }

图论:DFS序的更多相关文章

  1. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)

    传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...

  2. 图论——Tarjan 初步 DFS序+时间戳+欧拉序

    一.什么是DFS序: DFS序是按照先序遍历,先遍历根节点然后依次遍历左子树,右子树的过程,每次遇到新的节点就把新访问节点加到序列中,代码如下: int DFSrk[100000]; int cnt= ...

  3. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  4. [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]

    题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...

  5. BZOJ3772 精神污染 【主席树 + dfs序】

    题目 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海 ...

  6. bzoj 3772 精神污染 主席树+dfs序

    精神污染 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 637  Solved: 177[Submit][Status][Discuss] Descri ...

  7. 树链剖分(附带LCA和换根)——基于dfs序的树上优化

    .... 有点懒: 需要先理解几个概念: 1. LCA 2. 线段树(熟练,要不代码能调一天) 3. 图论的基本知识(dfs序的性质) 这大概就好了: 定义: 1.重儿子:一个点所连点树size最大的 ...

  8. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  9. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

随机推荐

  1. 冲刺阶段站立会议每日任务i4

    昨天对小组成员的任务进行了进一步细化分配,今天了解了安卓开发环境的相关知识. 遇到的问题: 没有遇到问题.

  2. 【acm】杀人游戏(hdu2211)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2211 杀人游戏 Time Limit: 3000/1000 MS (Java/Others)    M ...

  3. 【Quartz.Net】.net 下使用Quartz.Net

    Quartz.net是作业调度框架 1. 项目中添加quartz.net的引用(这里使用nuget管理) 新建一个类TimingJob,该类主要用于实现任务逻辑   using Quartz; usi ...

  4. 【Java】接口开发中关于接受和发送json的相关范例

    接受json package com.suneee.scn.wms.web.rocketmq; import java.util.List; import net.sf.json.JSONArray; ...

  5. Redis windows环境安装 以及 redis整合spring

    Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定.详情请参考: http://redis.io/download Redis官方是不支持wind ...

  6. Shell脚本修改Nginx upstream配置文件

    #!/bin/bash ##################################################### # Name: change_nginx_upstream_conf ...

  7. P1065 作业调度方案

    题目描述 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每个工序称为一个操作,我们用记号j−k表示一个 ...

  8. TCP的拥塞控制 (四)

     TCP NewReno   NewReno是在Reno的基础上,改进了Fast Recovery,主要思想是保证处于network中的packet的总量是饱和的. 在Reno算法中,一个超时会导致相 ...

  9. 常州day5

    Task 1 小 W 和小 M 一起玩拼图游戏啦~ 小 M 给小 M 一张 N 个点的图,有 M 条可选无向边,每条边有一个甜蜜值,小 W 要选 K条边,使得任意两点间最多有一条路径,并且选择的 K条 ...

  10. Rearrangement inequality

    摘抄自:  https://en.wikipedia.org/wiki/Rearrangement_inequality#Proof In mathematics, the rearrangement ...