题目描述

松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的。天哪,他居然真的住在”树“上。

松鼠想邀请小熊维尼前来参观,并且还指定一份参观指南,他希望维尼能够按照他的指南顺序,先去a1,再去a2,......,最后到an,去参观新家。可是这样会导致维尼重复走很多房间,懒惰的维尼不停地推辞。可是松鼠告诉他,每走到一个房间,他就可以从房间拿一块糖果吃。

维尼是个馋家伙,立马就答应了。现在松鼠希望知道为了保证维尼有糖果吃,他需要在每一个房间各放至少多少个糖果。

因为松鼠参观指南上的最后一个房间an是餐厅,餐厅里他准备了丰盛的大餐,所以当维尼在参观的最后到达餐厅时就不需要再拿糖果吃了。

题目分析

树剖,树状数组维护

相邻两个计划点之间的点权++,第2~n个计划点点权-1。

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. const int MAXN = + ;
  6.  
  7. struct Edge {
  8. int nxt;
  9. int to;
  10. } l[MAXN<<];
  11.  
  12. int n,root;
  13. int head[MAXN],cnt;
  14. int deep[MAXN],fa[MAXN],siz[MAXN],heavy[MAXN];
  15. int id[MAXN],tot;
  16. int a[MAXN],c[MAXN],top[MAXN];
  17.  
  18. inline void add(int x,int y) {
  19. cnt++;
  20. l[cnt].nxt = head[x];
  21. l[cnt].to = y;
  22. head[x] = cnt;
  23. return;
  24. }
  25.  
  26. void dfs1(int x,int from) {
  27. deep[x] = deep[from] + ;
  28. fa[x] = from;
  29. int tmp = ;
  30. siz[x] = ;
  31. for(int i = head[x];i;i = l[i].nxt) {
  32. if(l[i].to == from) continue;
  33. dfs1(l[i].to,x);
  34. siz[x] += siz[l[i].to];
  35. if(siz[l[i].to] > tmp) {
  36. tmp = siz[l[i].to];
  37. heavy[x] = l[i].to;
  38. }
  39. }
  40. return;
  41. }
  42.  
  43. void dfs2(int x,int tp,int from) {
  44. id[x] = ++tot;
  45. top[x] = tp;
  46. if(!heavy[x]) return;
  47. dfs2(heavy[x],tp,x);
  48. for(int i = head[x];i;i = l[i].nxt) {
  49. if(l[i].to == from || l[i].to == heavy[x]) continue;
  50. dfs2(l[i].to,l[i].to,x);
  51. }
  52. return;
  53. }
  54.  
  55. inline int lowbit(int x) {
  56. return x & (-x);
  57. }
  58.  
  59. inline void modify(int x,int y,int v) {
  60. for(int i = x;i <= n;i += lowbit(i)) c[i]+=v;
  61. for(int i = y+;i <= n;i += lowbit(i)) c[i]-=v;
  62. return;
  63. }
  64.  
  65. inline int query(int x) {
  66. int res = ;
  67. for(int i = x;i;i -= lowbit(i)) res += c[i];
  68. return res;
  69. }
  70.  
  71. inline void wayadd(int x,int y,int v) {
  72. while(top[x] != top[y]) {
  73. if(deep[top[x]] < deep[top[y]]) swap(x,y);
  74. modify(id[top[x]],id[x],v);
  75. x = fa[top[x]];
  76. }
  77. if(deep[x] > deep[y]) swap(x,y);
  78. modify(id[x],id[y],v);
  79. return;
  80. }
  81.  
  82. int main() {
  83. scanf("%d",&n);
  84. for(int i = ;i <= n;i++) {
  85. scanf("%d",&a[i]);
  86. }
  87. root = a[];
  88. int x,y;
  89. for(int i = ;i < n;i++) {
  90. scanf("%d%d",&x,&y);
  91. add(x,y);add(y,x);
  92. }
  93. dfs1(root,);
  94. dfs2(root,root,);
  95. for(int i = ;i < n;i++) {
  96. wayadd(a[i],a[i+],);
  97. wayadd(a[i+],a[i+],-);
  98. }
  99. for(int i = ;i <= n;i++) {
  100. printf("%d\n",query(id[i]));
  101. }
  102. return ;
  103. }

[Luogu] P3258 [JLOI2014]松鼠的新家的更多相关文章

  1. 【luogu P3258 [JLOI2014]松鼠的新家】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3258 谁说树剖过不去会RE呢? 我今天就是要强行树剖了 树剖强艹 #include <cstdio&g ...

  2. P3258 [JLOI2014]松鼠的新家

    P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...

  3. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  4. 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家

    [题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...

  5. [Luogu 3258] JLOI2014 松鼠的新家

    [Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...

  6. 洛谷P3258 [JLOI2014]松鼠的新家

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  7. P3258[JLOI2014]松鼠的新家(LCA 树上差分)

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  8. 洛谷 P3258 [JLOI2014]松鼠的新家 题解

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  9. 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...

随机推荐

  1. 说说循环与闭包——《你不知道的JS》读书笔记(一)

    什么是闭包 <你不知道的JS>里有对闭包的定义:"当函数可以记住并访问所在的词法作用域,即使函数是在当前作用域之外执行,这就产生了闭包." 讲闭包是啥的太多了...就一 ...

  2. go1

    关键字: break default func interface select case defer go map struct chan else goto package switch cons ...

  3. 开源框架 KJFrameForAndroid

    一个Android的快速开发工具包,使用它你可以轻松实现网络请求.插件化开发.图片加载等功能.KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化A ...

  4. dubbo作者讲编码原则

    刚看到梁飞谈到dubbo为保证代码质量开发人员必须要注意的,其实也是开发人员应该做的. 1. 防止空指针和下标越界 这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常, 这 ...

  5. SQL 存储过程语句拼接愁人的时间类型

    http://www.cnblogs.com/yrup/p/4201329.html 解决方法: Select CONVERT(varchar(100), GETDATE(), 25): 2006-0 ...

  6. Python机器学习算法 — 决策树(Decision Tree)

    决策树 -- 简介         决策树(decision tree)一般都是自上而下的来生成的.每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵 ...

  7. Unity使用外部版本控制

    Using External Version Control Systems with Unity Unity offers an Asset Server add-on product for ea ...

  8. nat模式下更改网络环境, 虚拟机中Linux无法上网的问题

    出现的问题: 1.ifconfig -a 命令下会出现eth0信息中无ip地址等等信息: 2.无法ping通baidu,也就是无法上网: 3.ping 8.8.8.8 提示 connect:netwo ...

  9. MyEclipse日志文件目录

    MyEclipse存放日志的目录为: <Workspace_Root>/.metadata/.log 在该目录下存放了日志的存档和当前日志,通过该日志可以查看MyEclipse的错误信息.

  10. 转 phpmyadmin操作技巧:如何在phpmyadmin里面复制mysql数据库?

    对于每一个站长而言,都会遇到要进行网站测试的时候.这个时候,往往需要备份数据库.如果按照一般的操作方式,都是先把数据库导出并备份到本地,然后再服务器上测试.如果一切正常还好,一旦出了问题,就又得把数据 ...