题目描述
题目

本来想写一道Tarjan的,结果发现这题倍增比较好写
这题主要要搞懂树上差分这东西(NOIP前这东西卡了我好久)
大概要注意的就是对于除了出发点以外的所有点都是重复算了的,所以最后要有-1操作

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=300010;
int f[N][20],head[N],a[N],b[N],dep[N];
int now,n;
struct E{int to,next;}e[N<<1];
void build(int u,int v){e[++now].to=v;e[now].next=head[u];head[u]=now;}void dfs1(int u,int fa)
{f[u][0]=fa;for(int i=1;f[u][i-1];i++) f[u][i]=f[f[u][i-1]][i-1];for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(v == fa) continue;dep[v]=dep[u]+1;dfs1(v,u);}
}int lca(int u,int v)
{if(dep[u] > dep[v]) swap(u,v);int d=dep[v]-dep[u];for(int i=0;(1<<i) <= d;i++)if((1<<i) & d) v=f[v][i];if(u == v) return u;for(int i=19;i >= 0;i--)if(f[u][i] != f[v][i])u=f[u][i],v=f[v][i];return f[u][0];
}int read(){int out=0;char c=getchar();while(c > '9' || c < '0') c=getchar();while(c >= '0' && c <= '9') {out=(out<<1)+(out<<3)+c-'0';c=getchar();}return out;
}void init()
{n=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<n;i++) {int u=read(),v=read();build(u,v);build(v,u);}dfs1(1,0);
}void dfs2(int u)
{for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(v == f[u][0]) continue;dfs2(v);b[u]+=b[v];}
}void solve()
{for(int i=2;i<=n;i++){int u=a[i-1],v=a[i],glca=lca(u,v);b[u]++;b[v]++;b[f[glca][0]]--;b[glca]--;}dfs2(1);for(int i=2;i<=n;i++) b[a[i]]--;for(int i=1;i<=n;i++) printf("%d\n",b[i]);
}int main()
{init();solve();return 0;
}

转载于:https://www.cnblogs.com/zerolt/p/9260895.html

[JLOI2014]松鼠的新家 倍增LCA+树上差分相关推荐

  1. bzoj 3631: [JLOI2014]松鼠的新家(LCA+树上差分)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2059  Solved: 1030 [Submit][S ...

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

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

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

    缘起 [1]中我们学习了树上差分,并且a了一个裸的点差分. 现在继续树上差分~ 洛谷 P3258 [JLOI2014]松鼠的新家 分析 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房 ...

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

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

  5. P3258 [JLOI2014]松鼠的新家

    文章目录 题意: 题解: 树上差分 代码: 树链剖分 代码: P3258 [JLOI2014]松鼠的新家 题意: n个点,n-1条边,给出每个点的拜访顺序,问每个点经过几次(最后一次移动不算拜访) 题 ...

  6. P3258 [JLOI2014] 松鼠的新家 题解

    P3258 [JLOI2014] 松鼠的新家 题解 洛谷 P3258 题目 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有 nnn 个房间,并且有 nnn−1 根树枝连接,每个房间都可以相互到达,且 ...

  7. 【BZOJ 3631】 [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 681 Solved: 329 [Submit][Statu ...

  8. bzoj3631[JLOI2014]松鼠的新家

    bzoj3631[JLOI2014]松鼠的新家 题意: 给个n点树,再给个节点的游览顺序,每经过一个节点(包括上一个游览的点到下一个游览的点路径上的点)就可以从这个节点拿走一个糖,问所有节点一开始要放 ...

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

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

最新文章

  1. 人工智能其实并不客观,算法会加剧刻板印象
  2. Android 系统当中各种尺寸单位的定义及使用
  3. html万年历闹钟怎么取消,万年历如何取消整点报时,他上面有四个键,分...
  4. Spring.Resource与Spring资源获取方式
  5. WCF、WebAPI、WCFREST、WebService之间的区别
  6. HTTP的长链接和短链接说明
  7. mac远程redis_Linux:使用Mac远程(局域网内)访问Ubuntu主机上的Redis服务
  8. 云服务器php版本修改,云服务器 更改php版本
  9. 游戏服务器高性能负载均衡,游戏服务器高可用负载均衡
  10. 使用php下载网络图片有哪些方法,php下载网络图片常用的三个方法总结
  11. linux镜像文件_深度UI + Ubuntu系统,堪称最强最美Linux发行版!你敢升级吗?
  12. 【skimage.util.shape】有关view_as_windows裁剪数组及恢复的简单尝试
  13. Interesting Finds: 2008.04.18
  14. 云原生技术开放日PPT大放送 | 五星级的云原生开发体验
  15. 微信小程序demo、开发工具下载地址
  16. docker部署案例
  17. 利用在线技术更改图片清晰度
  18. 古往今来中国最经典的50句名言
  19. bellman算法流程
  20. 服务器nvida显卡驱动安装(亲测)

热门文章

  1. [Java] 蓝桥杯ALGO-151 算法训练 6-2递归求二进制表示位数
  2. L1-001. Hello World-PAT团体程序设计天梯赛GPLT
  3. 1014. 福尔摩斯的约会 (20)-PAT乙级真题
  4. 【C++】使用setprecision控制输出流显示浮点数的有效数字个数
  5. java的ssh获取id,使用SSH公钥(id_dsa.pub)实现免密码登录
  6. python 浮点数比较_Python中的浮点数
  7. java中使用MD5进行加密
  8. java 获取mongodb的连接数
  9. Hive四种数据导入方式介绍
  10. 搭建DNS服务,正向解析域名