P3258 [JLOI2014]松鼠的新家

题目描述

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

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

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

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

输入输出格式

输入格式:

第一行一个整数n,表示房间个数第二行n个整数,依次描述a1-an

接下来n-1行,每行两个整数x,y,表示标号x和y的两个房间之间有树枝相连。

输出格式:

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


树链剖分+差分数组,很裸的一个题,注意细节即可


#include <cstdio>
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
const int N=300010;
int to[N<<1],next[N<<1],cnt,head[N];
void add(int u,int v)
{to[++cnt]=v;next[cnt]=head[u];head[u]=cnt;
}
int ws[N],siz[N],f[N],dfn[N],top[N],dep[N],ha[N],d[N],time=0;
int ans[N],n,a[N];
void dfs1(int now)
{for(int i=head[now];i;i=next[i]){int v=to[i];if(v!=f[now]){f[v]=now;dep[v]=dep[now]+1;dfs1(v);siz[now]+=siz[v];if(siz[ws[now]]<siz[v]) ws[now]=v;}}siz[now]++;
}
void dfs2(int now,int anc)
{dfn[now]=++time;top[now]=anc;ha[time]=now;if(!ws[now]) return;dfs2(ws[now],anc);for(int i=head[now];i;i=next[i]){int v=to[i];if(!dfn[v])dfs2(v,v);}
}
void t_add(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]>dep[top[y]]){d[dfn[top[x]]]++;d[dfn[x]+1]--;x=f[top[x]];}else{d[dfn[top[y]]]++;d[dfn[y]+1]--;y=f[top[y]];}}d[min(dfn[x],dfn[y])]++;d[max(dfn[x],dfn[y])+1]--;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);int u,v;for(int i=1;i<n;i++){scanf("%d%d",&u,&v);add(u,v),add(v,u);}dfs1(1);dfs2(1,1);for(int i=1;i<n;i++)t_add(a[i],a[i+1]);for(int i=1;i<=n;i++){d[i]+=d[i-1];ans[ha[i]]=d[i];if(ha[i]!=a[1]) ans[ha[i]]--;}for(int i=1;i<=n;i++)printf("%d\n",ans[i]);return 0;
}

2018.6.15

转载于:https://www.cnblogs.com/butterflydew/p/9188273.html

洛谷 P3258 [JLOI2014]松鼠的新家 解题报告相关推荐

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

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

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

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

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

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

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

    题目要求熟练掌握树剖的概念,以及确定线段树的标号,题目应该不算难 这 n 个点之间,每两点之间都加 1 ,这样只有最后一个点和第一个点没有做多余的操作,题目还要求最后一次到达终点时不用再拿糖果,所以除 ...

  5. 【LOJ#2236】【洛谷P3258】松鼠的新家【LCA】【树上差分】

    题目大意: 题目链接: 洛谷:https://www.luogu.org/problem/P3258 LOJ:https://loj.ac/problem/2236 给出一棵树以及 n n n个点走的 ...

  6. 【洛谷P3258】松鼠的新家

    很好的一道题 LCA+树上前缀和 sum数组是前缀和数组, 分类讨论一下, 1.访问到一个点p1,若下一个点p2需要往儿子下面找的话,那么lca就是这个点p1,则sum[p1]--; sum[p2]+ ...

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

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

  8. P3258 [JLOI2014]松鼠的新家

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

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

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

最新文章

  1. 这里有最全的k8s初学者指南!!!
  2. tf.keras.layers.Flatten该网络中的第一层tf.keras.layers.Flatten将图像的格式从2d阵列(28乘28像素)转换为28 * 28 = 784像素的1d阵列。可以
  3. C++ STL库的总结以及实现原理
  4. LeetCode Find All Duplicates in an Array
  5. java static用法_Java中static关键字的作用和用法详细介绍
  6. ArrayList与LinkedList的比较
  7. css设置元素的宽高为整数,为什么有的浏览器解析出来的宽高是小数?
  8. Spring系列(五):@Lazy懒加载注解用法介绍
  9. 迁移聊天记录到Teams
  10. JS点击获取验证码后60秒内禁止重新获取(防刷新)
  11. Linux 驱动层实现阻塞和非阻塞
  12. Python画图显示中文
  13. Python递归绘制谢尔宾斯基三角形
  14. regester正则用法_Regester-Regester(正则表达式测试器)下载 v2.0.1官方版-下载啦
  15. 扎心!五成程序员年薪 10-20 万,超半数资深程序员薪资高于 20 万
  16. AI笔记: 数学基础之齐次与非齐次线性方程组解的结构定理
  17. python电影名称词云_python爬虫——词云分析最热门电影《后来的我们》
  18. 统计学期末重点讲解(医学)
  19. QR code二维码简介及Qrencode库的移植与使用
  20. java google map_java如何通过google map api实现地址解析

热门文章

  1. BZOJ3057 圣主的考验
  2. print($arr,true)的参数true表示将$arr的值返会,而不是打印
  3. SQL2000无法建立管理单元
  4. 网站链接自动化测试原理及工具介绍
  5. Mobile-LPR——面向移动端的准商业级车牌识别库
  6. Spiking-YOLO : 前沿!脉冲神经网络在目标检测的首次尝试 | AAAI 2020
  7. 人群计数(Crowd Counting)研究综述
  8. ps 2键盘代码 c语言,MicroBlaze中断编程——以PS/2键盘输入为例
  9. 无意间发现BAT大佬总结的一份目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  10. 收藏 | 图解 Git 工作原理