题目:一颗树,单边修改,链上查询。。实际上链是根到结点的链。网上好像有其他做法,我的想法是这样的:

先不看修改,毫无疑问查询只是查询结点的深度;而修改一条边会有什么影响:影响是且只是以边上深度最深结点为根的子树。

所以就是DFS序了。把子树转化为区间,然后用区间修改、单点查询的线段树维护。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. #define MAXN 255555
  6. struct Edge{
  7. int v,nxt;
  8. }edge[MAXN];
  9. int n,NE,head[MAXN];
  10. void addEdge(int u,int v){
  11. edge[NE].v=v; edge[NE].nxt=head[u]; head[u]=NE++;
  12. }
  13.  
  14. int dep[MAXN],l[MAXN],r[MAXN],stack[MAXN],odr;
  15. void dfs(){
  16. int top=;
  17. stack[++top]=;
  18. while(top){
  19. int u=stack[top];
  20. if(l[u]){
  21. r[u]=odr; --top;
  22. continue;
  23. }
  24. l[u]=++odr;
  25. for(int i=head[u]; i!=-; i=edge[i].nxt){
  26. int v=edge[i].v;
  27. stack[++top]=v;
  28. dep[v]=dep[u]+;
  29. }
  30. }
  31. }
  32.  
  33. int tree[MAXN<<],N,x,y;
  34. void update(int i,int j,int k){
  35. if(x<=i&&j<=y){
  36. ++tree[k];
  37. return;
  38. }
  39. if(tree[k]){
  40. tree[k<<]+=tree[k]; tree[k<<|]+=tree[k];
  41. tree[k]=;
  42. }
  43. int mid=i+j>>;
  44. if(x<=mid) update(i,mid,k<<);
  45. if(y>mid) update(mid+,j,k<<|);
  46. }
  47. int query(int i,int j,int k){
  48. if(i==j) return tree[k];
  49. if(tree[k]){
  50. tree[k<<]+=tree[k]; tree[k<<|]+=tree[k];
  51. tree[k]=;
  52. }
  53. int mid=i+j>>;
  54. if(x<=mid) return query(i,mid,k<<);
  55. return query(mid+,j,k<<|);
  56. }
  57.  
  58. int main(){
  59. int m,a,b;
  60. char op[];
  61. memset(head,-,sizeof(head));
  62. scanf("%d",&n);
  63. for(int i=; i<n; ++i){
  64. scanf("%d%d",&a,&b);
  65. if(a>b) swap(a,b);
  66. addEdge(a,b);
  67. }
  68. dfs();
  69. for(N=; N<odr; N<<=);
  70. scanf("%d",&m);
  71. m+=n-;
  72. while(m--){
  73. scanf("%s",op);
  74. if(op[]=='W'){
  75. scanf("%d",&a);
  76. x=l[a];
  77. printf("%d\n",dep[a]-query(,N,));
  78. }else{
  79. scanf("%d%d",&a,&b);
  80. if(a<b) a=b;
  81. x=l[a]; y=r[a];
  82. update(,N,);
  83. }
  84. }
  85. return ;
  86. }

BZOJ1103 [POI2007]大都市meg(DFS序)的更多相关文章

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

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

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

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

  3. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

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

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

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

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

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

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

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

  7. bzoj1103: [POI2007]大都市meg

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

  8. 大都市meg DFS序

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

  9. BZOJ1103[POI2007]大都市meg 题解

    题目大意: 有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和:2.将一条边的权值改为0. 思路: 用dfs序将树化为序列,在dfs序中我们会保存 ...

随机推荐

  1. Android.mk详解

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握jni,就必须熟练掌握Andr ...

  2. shell安装MySQL二进制包

    现在解压MySQL二进制包,稍作配置,就能用了,安装速度快,安装来练习最好不过了,哈哈 该脚本只是安装二进制的MySQL包,my.cnf只修改了简单的选项,没有过多进行设置,若朋友们用我的脚本安装作为 ...

  3. [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性

    之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...

  4. [Effective JavaScript 笔记]第59条:避免过度的强制转换

    js是弱类型语言.许多标准的操作符和代码库会把输入参数强制转换为期望的类型而不是抛出错误.如果未提供额外的逻辑,使用内置操作符的程序会继承这样的强制转换行为. functin square(x){ r ...

  5. MBProgressHUD使用

    //方式1.直接在View上show HUD = [[MBProgressHUD showHUDAddedTo:self.view animated:YES] retain]; HUD.delegat ...

  6. [BZOJ3671][UOJ#6][NOI2014]随机数生成器

    [BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...

  7. 一张图说明该选用神马程式来serve你的django应用

  8. 每天一个linux命令day2【ss命令】

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...

  9. java 实现二分查找法

    /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * @author Administrator * */ p ...

  10. 修改Tomcat服务器的默认端口号

    tomcat服务器的默认端口号是8080,我们也可以修改为其他端口号,并且在没有启动Apache,IIS等占用80端口的web服务时,我们也可以设置为80端口,这样在生产中域名之后就可以不带端口号了, ...