链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3631

思路:

直接用树链剖分求每一次运动,因为这道题只需要区间增添,单点求值,没必要用线段树,直接数组标记下就好了

实现代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define lson l,m,rt<<1
  5. #define rson m+1,r,rt<<1|1
  6. #define mid int m = (l + r) >> 1
  7.  
  8. const int M = 1e5 + ;
  9. int cnt,cnt1;
  10. int head[M],dep[M],fa[M],top[M],son[M],siz[M],tid[M],sum[M],a[M];
  11.  
  12. struct node{
  13. int to,next;
  14. }e[M];
  15.  
  16. void add(int u,int v){
  17. e[++cnt].to = v;e[cnt].next = head[u];head[u] = cnt;
  18. }
  19.  
  20. void dfs1(int u,int faz,int deep){
  21. dep[u] = deep;
  22. fa[u] = faz;
  23. siz[u] = ;
  24. for(int i = head[u];i;i=e[i].next){
  25. int v = e[i].to;
  26. if(v == fa[u]) continue;
  27. dfs1(v,u,deep+);
  28. siz[u] += siz[v];
  29. if(siz[v] > siz[son[u]]||son[u] == -)
  30. son[u] = v;
  31. }
  32. }
  33.  
  34. void dfs2(int u,int t){
  35. top[u] = t;
  36. tid[u] = ++cnt1;
  37. if(son[u] == -) return ;
  38. dfs2(son[u],t);
  39. for(int i = head[u];i;i=e[i].next){
  40. int v = e[i].to;
  41. if(v != fa[u]&&v != son[u])
  42. dfs2(v,v);
  43. }
  44. }
  45.  
  46. void update(int x,int y){
  47. sum[x]++;
  48. sum[y+]--;
  49. }
  50.  
  51. void solve(int x,int y){
  52. int fx = top[x],fy = top[y];
  53. int ans = ;
  54. while(fx!=fy){
  55. if(dep[fx] < dep[fy]) swap(x,y),swap(fx,fy);
  56. update(tid[fx],tid[x]);
  57. x = fa[fx]; fx = top[x];
  58. }
  59. if(dep[x] > dep[y]) swap(x,y);
  60. update(tid[x],tid[y]);
  61. }
  62.  
  63. int main(){
  64. int n,x,y;
  65. scanf("%d",&n);
  66. memset(son,-,sizeof(son));
  67. for(int i = ;i <= n;i ++){
  68. scanf("%d",&a[i]);
  69. }
  70. int n1 = n-;
  71. while(n1--){
  72. scanf("%d%d",&x,&y);
  73. add(x,y); add(y,x);
  74. }
  75. dfs1(,,); dfs2(,);
  76. for(int i = ;i <= n;i ++)
  77. solve(a[i-],a[i]);
  78. for(int i = ;i <= n;i ++){
  79. sum[i] += sum[i-];
  80. }
  81. // cout<<<<endl;
  82. for(int i = ;i <= n;i ++){
  83. if(i == ) printf("%d\n",sum[tid[i]]);
  84. else printf("%d\n",sum[tid[i]]-);
  85. }
  86. return ;
  87. }

bzoj 3631 松鼠的新家 (树链剖分)的更多相关文章

  1. BZOJ - 3631 松鼠的新家 (树链剖分)

    题目链接 树链剖分基础题,路径权值修改+差分 #include<bits/stdc++.h> using namespace std; typedef long long ll; ; in ...

  2. BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分

    传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...

  3. BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )

    裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...

  4. Bzoj 3631: [JLOI2014]松鼠的新家(树链剖分+线段树)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个 ...

  5. 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)

    题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...

  6. BZOJ3631 松鼠的新家(树链剖分)

    题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...

  7. 【BZOJ3631】松鼠的新家 树链剖分

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

  8. P3285 松鼠的新家 (树链剖分)

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

  9. P3258 [JLOI2014]松鼠的新家 树链剖分

    这个题就是一道树剖板子题,就是每走一步就把所有的经过点加一就行了.还有,我的树剖板子没问题!!!谁知道为什么板子T3个点!我不管了!反正这道题正常写A了. 题干: 题目描述 松鼠的新家是一棵树,前几天 ...

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

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

随机推荐

  1. Centos 7 修改系统时区

    timedatectl status Local time: 四 2014-12-25 10:52:10 CST Universal time: 四 2014-12-25 02:52:10 UTC R ...

  2. itoa函数实现

    1.      整数字符转化为字符串数 // 将整数转换成字符串数,不用函数itoa // 思路:采用加'0',然后在逆序的方法 #include <iostream> using nam ...

  3. Python-常见面试题-持续更新

    1.请你简要介绍一下Python的生成器是什么 答:Python生成器是一个返回可以迭代对象的函数,可以被用作控制循环的迭代行为. 生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用 ...

  4. Elasticsearch - 简单介绍

    Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时 ...

  5. Form的is_valid校验规则及验证顺序

    一.验证顺序   查看form下的源码了解顺序 BaseForm为基类,中间包含了is_valid校验方法 @html_safe class BaseForm: ......... self.is_b ...

  6. CRM系统(第二部分)

      阅读目录 一.讲师与学生简介 二. 初始化 ,studyrecord, 三.初始化 course_record:批量生成学习记录 四. 考勤  url跳转 五.录入成绩 六.highcharts表 ...

  7. Pair Project

    以前只是一个人完成一个项目,不论什么都是,现在突然要两个人一起来写, 听上去挺稀奇的,也挺简单的,可惜了就是“听上去”而已.我认为这也是一种技术啊~ 我跟我的搭档研究了好久好久,选择了好久,然后也选了 ...

  8. [学习]UX 测试 5S 范围

    最近被UX测试搞的死去活来的 郁闷坏了. 豆瓣上面有一个介绍: 好的框架总是简洁的. Strategy - Scope - Structure - Skeleton - Surface五个层面,用bo ...

  9. 日期选择器date、week、time、datetime、datetime-local类型

    下面只写两个类型的代码案例,其他都大同小异 date类型: <!DOCTYPE html> <html> <head> <meta charset=" ...

  10. day 7-16 单表查询

    一.准备工作 先把表建立好,方便一会查询. create table emp( id int not null unique auto_increment, name varchar(20) not ...