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

题目大意:给定含有n个顶点的树,给定走遍整棵树顺序的序列a[1],a[2],a[3]……a[n],表示要从a[1]走到a[2],再从a[2]走到a[3],直到走到a[n],经过的点的点权需要加1,最后输出每个点的点权。

解题思路:首先我们讨论对于走一次的情况,假设从s走到t,我们可以让ans[s]++,ans[t]++,ans[LCA(s,t)]--,并且让s和t的LCA的父亲也减1,最后上推,然后第2个节点到第n个节点多走了一次,就减去1就可以了。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=+;
  5. int n,tot,a[maxn],head[maxn],fa[maxn][],depth[maxn],ans[maxn];
  6. struct Edge{
  7. int v,next;
  8. }edge[maxn*];
  9. void add(int u,int v){
  10. edge[tot].v=v;
  11. edge[tot].next=head[u];
  12. head[u]=tot++;
  13. }
  14. void dfs(int u,int pre){
  15. depth[u]=depth[pre]+;
  16. fa[u][]=pre;
  17. for(int i=;i<=;i++)
  18. fa[u][i]=fa[fa[u][i-]][i-];
  19. for(int i=head[u];i!=-;i=edge[i].next){
  20. int v=edge[i].v;
  21. if(v==pre) continue;
  22. dfs(v,u);
  23. }
  24. }
  25. int LCA(int u,int v){
  26. if(depth[u]<depth[v]) swap(u,v);
  27. for(int i=;i>=;i--){
  28. if(depth[u]-(<<i)>=depth[v]) u=fa[u][i];
  29. }
  30. if(u==v) return u;
  31. for(int i=;i>=;i--){
  32. if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
  33. }
  34. return fa[u][];
  35. }
  36. void dfs1(int u,int pre){
  37. for(int i=head[u];i!=-;i=edge[i].next){
  38. int v=edge[i].v;
  39. if(v==pre) continue;
  40. dfs1(v,u);
  41. ans[u]+=ans[v];
  42. }
  43. }
  44. int main(){
  45. scanf("%d",&n);
  46. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  47. memset(head,-,sizeof(head));
  48. for(int i=;i<n;i++){
  49. int u,v;
  50. scanf("%d%d",&u,&v);
  51. add(u,v); add(v,u);
  52. }
  53. depth[]=-;
  54. dfs(,);
  55. for(int i=;i<n;i++){
  56. ans[a[i]]++;
  57. ans[a[i+]]++;
  58. int lca=LCA(a[i],a[i+]);
  59. ans[fa[lca][]]--;
  60. ans[lca]--;
  61. }
  62. dfs1(,);
  63. for(int i=;i<=n;i++)ans[a[i]]--;
  64. for(int i=;i<=n;i++)
  65. printf("%d\n",ans[i]);
  66. return ;
  67. }

bzoj3631: [JLOI2014]松鼠的新家(树上差分)的更多相关文章

  1. bzoj3631 [JLOI2014]松鼠的新家——树上差分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...

  2. BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA

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

  3. [JLOI2014]松鼠的新家 树上差分

    差分 一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不 ...

  4. BZOJ.3631.[JLOI2014]松鼠的新家(树上差分)

    题目链接 树剖/差分裸题.. //28260kb 584ms #include <cstdio> #include <cctype> #include <algorith ...

  5. [Bzoj3631][JLOI2014]松鼠的新家 (树上前缀和)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2350  Solved: 1212[Submit][Sta ...

  6. BZOJ3631 [JLOI2014]松鼠的新家 【树上差分】

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

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

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

  8. 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组

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

  9. bzoj3631[JLOI2014 松鼠的新家 倍增lca+差分

    裸的树上差分+倍增lca 每次从起点到终点左闭右开,这就有一个小技巧,要找到右端点向左端点走的第一步,然后差分就好了 #include<cstdio> #include<cstrin ...

  10. BZOJ 3631 松鼠的新家 树上差分

    我猜会有智障说直接链剖+线段树…(希望没有) From RYC's 课件 然鹅我并不反对树剖...我是智障...QAQ 好吧还是树上差分:设 a[i]=u.a[i+1]=v ++w[u],++w[v] ...

随机推荐

  1. Python深度学习读书笔记-4.神经网络入门

    神经网络剖析   训练神经网络主要围绕以下四个方面: 层,多个层组合成网络(或模型) 输入数据和相应的目标 损失函数,即用于学习的反馈信号 优化器,决定学习过程如何进行   如图 3-1 所示:多个层 ...

  2. DeepFaceLab 如何开启轻量级编码器?

    很多人可能没有了解过这个参数.其实对于某些显存比较低的人,或者想要快点出结果的人非常有用. 什么是轻量级编码器? 轻量级本质上就是降低了神经网络的复杂程度(什么是神经网络? 这个….) 启用这个选项后 ...

  3. 阶段3 1.Mybatis_12.Mybatis注解开发_3 mybatis注解开发保存和更新功能

    使用直接来实现CRUD操作 Insert方法 创建测试类 把变量都定义在外面 写测试方法 修改链接的数据库 update方法 再加上address 被更新的数据

  4. Java多线程学习——图片下载

    实现多线程方式1:继承类Thread——重写方法run——调用方法start 从网络下载图片首先要增加包commons-io.jar import org.apache.commons.io.File ...

  5. 分类属性绘图(seaborn的catplot函数)

    可以通过指定catplot()函数的kind参数为"bar", "box", "violin"等分别绘制以前提过的柱形图,盒图,小提琴图等. ...

  6. 【Linux开发】Linux启动脚本设置

    前言linux有自己一套完整的启动 体系,抓住了linux启动 的脉络,linux的启动 过程将不再神秘.阅读之前建议先看一下附图.本文中假设inittab中设置的init tree为:/etc/rc ...

  7. input标签内容改变时触发事件

    1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发: onpropertychange事件是实时触发,每增加 ...

  8. .net core 学习小结之 配置介绍(config)以及热更新

    命令行的配置 var settings = new Dictionary<string, string>{ { "name","cyao"}, {& ...

  9. spring boot 异常汇总

    spring boot JPA 异常: org.springframework.data.mapping.PropertyReferenceException: No property role fo ...

  10. kubernetes快速应用入门

    kubectl 就是 api server的客户端工具 创建一个nginx的pod [root@master ~]# kubectl run nginx-deploy --image=nginx:1. ...