题目链接

题目描述

松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的。天哪,他居然真的住在”树“上。松鼠想邀请****前来参观,并且还指定一份参观指南,他希望**能够按照他的指南顺序,先去a1,再去a2,......,最后到an,去参观新家。可是这样会导致**重复走很多房间,懒惰的**不停地推辞。可是松鼠告诉他,每走到一个房间,他就可以从房间拿一块糖果吃。**是个馋家伙,立马就答应了。现在松鼠希望知道为了保证**有糖果吃,他需要在每一个房间各放至少多少个糖果。因为松鼠参观指南上的最后一个房间an是餐厅,餐厅里他准备了丰盛的大餐,所以当**在参观的最后到达餐厅时就不需要再拿糖果吃了。

输入输出格式

输入格式:

第一行一个整数n,表示房间个数第二行n个整数,依次描述a1-an接下来n-1行,每行两个整数x,y,表示标号x和y的两个房间之间有树枝相连。

输出格式:

一共n行,第i行输出标号为i的房间至少需要放多少个糖果,才能让**有糖果吃。

数据范围:

2<= n <=300000

样例

样例一输入:

5
1 4 5 3 2
1 2
2 4
2 3
4 5

样例一输出:

1
2
1
2
1

思路

1.树上差分

很明显的树上差分裸题,求出 $ A_{i} $ 和 $ A_{i+1} $ 的 $ lca $ 后点差分去做
就是需要注意 $ A_{i} \left( i \neq 1 \right) $ 会重复计算一次
所以输出答案时减掉

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <list>
#include <map>#define ll long long
#define ull unsigned long longusing namespace std;const int mx_n = 300010;
int n;
int a[mx_n-1];int w[mx_n];
int ans[mx_n];
int fa[mx_n][20],dep[mx_n];
int h[mx_n],to[mx_n<<1],nx[mx_n<<1],cnt;inline void add(int f,int t) {nx[++cnt] = h[f]; h[f] = cnt; to[cnt] = t;nx[++cnt] = h[t]; h[t] = cnt; to[cnt] = f;
}void dfs(int x) {for(int i = h[x]; i; i = nx[i])if(to[i] != fa[x][0]) {fa[to[i]][0] = x;dep[to[i]] = dep[x] + 1;dfs(to[i]);}
}int LCA(int x,int y) {if(dep[x] < dep[y]) swap(x,y);for(int i = 19; i >= 0; i--)if(dep[fa[x][i]] >= dep[y])x = fa[x][i];if(x == y) return x;for(int i = 19; i >= 0; i--)if(fa[x][i] != fa[y][i]) {x = fa[x][i];y = fa[y][i];} return fa[x][0];
}int deal(int x) {int now = w[x];for(int i = h[x]; i; i = nx[i])if(to[i] != fa[x][0]) {now += deal(to[i]);}ans[x] = now;return now;
}int main() {
//  freopen("testdata.in","r",stdin);
//  freopen("1.out","w",stdout);int c,b;scanf("%d",&n);for(int i = 1; i <= n; i++) {scanf("%d",&a[i]);}for(int i = 1; i < n; i++) {scanf("%d%d",&c,&b);add(c,b);}add(0,1);dfs(0);for(int i = 1; i <= 19; i++)for(int j = 1; j <= n; j++)fa[j][i] = fa[fa[j][i-1]][i-1];for(int i = 1; i < n; i++) {int x = a[i], y = a[i+1];int lca = LCA(x,y);w[lca]--;
//        cout << lca << '+' << endl;w[x]++;w[y]++;w[fa[lca][0]]--;}deal(0);for(int i = 1; i <= n; i++) {printf("%d\n",i == a[1] ? ans[i] : ans[i]-1);}
}

[JLOI2014]松鼠的新家 洛谷P3258相关推荐

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

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

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

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

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

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

  4. P3258 [JLOI2014]松鼠的新家

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

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

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

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

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

  7. 3631: [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 707  Solved: 342 [Submit][Sta ...

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

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

  9. bzoj3631[JLOI2014]松鼠的新家

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

最新文章

  1. 03-2 BGP专有命令--BGP命令与配置手册
  2. html div全屏遮罩层,Jquery全屏遮罩层DIV的实现代码
  3. 1346. 检查整数及其两倍数是否存在 golang
  4. rtt面向对象oopc——3.对官方IO设备模型框架图的补充绘图
  5. 13个你必须知道的JS数组技巧
  6. JS规则 自加一,自减一 ( ++和- -) 【mynum = mynum + 1;//等同于mynum++;】
  7. dynamipsGUI+VMware
  8. python做一段有意思的代码_Python爬虫入门有意思的小长代码
  9. LINUX中安装gotop检测页面
  10. 华为matebook X 笔记本没开什么程序,有时经常慢卡
  11. D-脱硫生物素dethiobiotinCAS号:533-48-2
  12. c#如何wmf图片转换成png图片_【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件-阿里云开发者社区...
  13. 电脑数据,电脑数据恢复软件,失易得数据恢复
  14. Nature证实:学术界刮起离职潮!大批学者涌向工业界,互助文档日均20个学者离职...
  15. 新的开始之Win7、CentOS 6.4 双系统 硬盘安装
  16. SOLR7实践(二)--DIH配置及使用
  17. 如何运用计算机辅助英语教学,谈英语计算机辅助教学 (中学英语教学论文)
  18. visio 新建个人模板
  19. 生成 App 专用密码 [How to generate an app-specific password]
  20. spectre13 matlab,惠普全新幽灵系列Spectre 13

热门文章

  1. 蓝奏批量自定义域名替换源码
  2. 原生js实现文本复制功能
  3. Matlab绘制阶梯形图
  4. java集成微信发送模板消息
  5. 【Pygame小游戏】神还原【欢乐无穷的双人坦克大战】小程序游戏,上手开玩~(附完整源码)
  6. 赏析角度有哪些_赏析句子的角度有哪些呢
  7. 基于中国航信Eterm开发
  8. myeclipse编辑jsp页面时光标乱跳
  9. 理解onMeasure
  10. 谷歌开源新模型 EfficientNet:图像识别效率提升 10 倍,参数减少 88%