大都市meg bzoj-1103 POI-2007

题目大意:给定一颗n个点的树,m次操作。将一条路的边权更改成0;查询一个点到根节点的点权和。开始的时候所有边的边权都是1。

注释:$1\le n,m\le 2.5\cdot 10^5$。


想法:我们先拉出dfs序。其实严格来讲是出栈入栈序,就是每个点在序上出现两次的那个。

开始的时候入栈时的点权是1,出栈是-1。修改就是把出栈入栈都改成0。然后用树状数组查询前缀和即可。

最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define N 250010
  6. using namespace std;
  7. int tree[N<<1],val[N<<1],head[N],to[N<<1],nxt[N<<1],tot,cnt;
  8. int dic[N<<1];
  9. struct Node
  10. {
  11. int x,y;
  12. }a[N];
  13. inline int lowbit(int x) {return x&(-x);}
  14. void fix(int x,int delta)
  15. {
  16. for(int i=x;i<=cnt+1;i+=lowbit(i))
  17. {
  18. // puts("fix");
  19. tree[i]+=delta;
  20. }
  21. }
  22. int query(int x)
  23. {
  24. int ans=0;
  25. for(int i=x;i>=1;i-=lowbit(i))
  26. {
  27. // puts("query");
  28. ans+=tree[i];
  29. }
  30. return ans;
  31. }
  32. inline void add(int x,int y)
  33. {
  34. to[++tot]=y;
  35. nxt[tot]=head[x];
  36. head[x]=tot;
  37. }
  38. void dfs(int pos,int fa)
  39. {
  40. // if(a[pos].x) puts("FUCK");
  41. dic[++cnt]=pos;
  42. // cnt++;
  43. val[cnt]=1;
  44. a[pos].x=cnt;
  45. for(int i=head[pos];i;i=nxt[i])
  46. {
  47. if(to[i]==fa) continue;
  48. dfs(to[i],pos);
  49. }
  50. dic[++cnt]=pos;
  51. // cnt++;
  52. val[cnt]=-1;
  53. a[pos].y=cnt;
  54. }
  55. int main()
  56. {
  57. int n; cin >> n ;
  58. int x,y;
  59. for(int i=1;i<n;i++)
  60. {
  61. scanf("%d%d",&x,&y);
  62. add(x,y); add(y,x);
  63. }
  64. dfs(1,0);
  65. val[1]=0;
  66. val[cnt]=0;
  67. for(int i=1;i<=cnt;i++)
  68. {
  69. fix(i,val[i]);
  70. }
  71. // printf("Gun %d\n",cnt);
  72. // for(int i=1;i<=cnt;i++)
  73. // {
  74. // printf("Shit %d\n",dic[i]);
  75. // }
  76. // puts("--------------------------------------");
  77. int m; cin >> m ;
  78. char opt[10];
  79. // for(int i=1;i<=n;i++) printf("%d %d\n",a[i].x,a[i].y);
  80. for(int i=1;i<=n+m-1;i++)
  81. {
  82. // printf("Fuck %d\n",i);
  83. scanf("%s",opt+1);
  84. if(opt[1]=='A')
  85. {
  86. scanf("%d%d",&x,&y);
  87. if(x>y) swap(x,y);
  88. fix(a[y].x,-1);
  89. fix(a[y].y,1);
  90. }
  91. else
  92. {
  93. scanf("%d",&x);
  94. // printf("%d\n",query(3));
  95. printf("%d\n",query(a[x].x));
  96. }
  97. }
  98. return 0;
  99. }

小结:简单题。

[bzoj1103][POI2007]大都市meg_dfs序_树状数组的更多相关文章

  1. [poj3321]Apple Tree_dfs序_树状数组

    Apple Tree poj-3321 题目大意:给你一个根固定的树,每一个点的点权是0或1,查询子树点权和. 注释:$1\le n \le 10^5$. 想法:刚刚学习dfs序,刷到水题偶哈哈. 什 ...

  2. BZOJ_5055_膜法师_树状数组+离散化

    BZOJ_5055_膜法师_树状数组+离散化 Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然 ...

  3. BZOJ_3653_谈笑风生_树状数组

    BZOJ_3653_谈笑风生_树状数组 Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称“a比b不知道 高明到哪里去了”. ...

  4. BZOJ_2141_排队_树状数组+分块

    BZOJ2141_排队_树状数组+分块 Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了 ...

  5. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  6. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  7. BZOJ_3132_上帝造题的七分钟_树状数组

    BZOJ_3132_上帝造题的七分钟_树状数组 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b), ...

  8. BZOJ 4999: This Problem Is Too Simple! DFS序+LCA+树状数组+离线

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) , ...

  9. 【BZOJ1103】大都市meg(DFS序,树状数组)

    题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...

随机推荐

  1. discuz的cutstr函数

    function cutstr($string, $length, $dot = ' ...') { if(strlen($string) <= $length) { return $strin ...

  2. P4407 [JSOI2009]电子字典

    传送门 我的哈希打挂了--然而大佬似乎用哈希可以过还跑得很快-- 删除,枚举删哪个字符,记删之后的哈希值存map 插入,相当于在单词里删字符,去对应的map里查找 更改,相当于两个都删掉同一个位置的字 ...

  3. IDEA报错,注解标红,提示Cannot resolve symbol xxx

    一般都是jar包没导进来,可以先看一下setting里maven配置的路径对不对

  4. day02_12/12/2016_bean的实例化之定义多个配置方式

  5. 343 Integer Break 整数拆分

    给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积.例如,给定 n = 2,返回1(2 = 1 + 1):给定 n = 10,返回36(10 = 3 ...

  6. python导入包出错:ImportError: No module named XXXXX

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...

  7. S2深入.NET编程总结

    不知从几何时,我也开始变得懒了,以往为了学习的那股子斗劲也早已不在,是时候反思反思了.失败的检测成绩希望可以把我唤醒. 经过总结,在本书中大概学到了这些知识: 1.如果一个类可序列化,则它的子类和包含 ...

  8. [ ZJOI 2006 ] Mahjong

    \(\\\) \(Description\) 现有权值分别为\(1\text~100\)的\(100\)种牌,分别给出每种排的张数\(A_i\),试判断能否胡牌,胡牌需要将所有牌不重不漏地分成以下几类 ...

  9. 前端-Node.js思维导图笔记

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记

  10. JS——if条件判断

    现在只说特殊情况: 1.一个变量,例如n1=null <script> var n1 = null; alert(n1);/*弹窗的值为null*/ if (n1 == null) {/* ...