[Luogu] P3258 [JLOI2014]松鼠的新家
题目描述
松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的。天哪,他居然真的住在”树“上。
松鼠想邀请小熊维尼前来参观,并且还指定一份参观指南,他希望维尼能够按照他的指南顺序,先去a1,再去a2,......,最后到an,去参观新家。可是这样会导致维尼重复走很多房间,懒惰的维尼不停地推辞。可是松鼠告诉他,每走到一个房间,他就可以从房间拿一块糖果吃。
维尼是个馋家伙,立马就答应了。现在松鼠希望知道为了保证维尼有糖果吃,他需要在每一个房间各放至少多少个糖果。
因为松鼠参观指南上的最后一个房间an是餐厅,餐厅里他准备了丰盛的大餐,所以当维尼在参观的最后到达餐厅时就不需要再拿糖果吃了。
题目分析
树剖,树状数组维护
相邻两个计划点之间的点权++,第2~n个计划点点权-1。
Code
#include<iostream>
#include<cstdio>
using namespace std; const int MAXN = + ; struct Edge {
int nxt;
int to;
} l[MAXN<<]; int n,root;
int head[MAXN],cnt;
int deep[MAXN],fa[MAXN],siz[MAXN],heavy[MAXN];
int id[MAXN],tot;
int a[MAXN],c[MAXN],top[MAXN]; inline void add(int x,int y) {
cnt++;
l[cnt].nxt = head[x];
l[cnt].to = y;
head[x] = cnt;
return;
} void dfs1(int x,int from) {
deep[x] = deep[from] + ;
fa[x] = from;
int tmp = ;
siz[x] = ;
for(int i = head[x];i;i = l[i].nxt) {
if(l[i].to == from) continue;
dfs1(l[i].to,x);
siz[x] += siz[l[i].to];
if(siz[l[i].to] > tmp) {
tmp = siz[l[i].to];
heavy[x] = l[i].to;
}
}
return;
} void dfs2(int x,int tp,int from) {
id[x] = ++tot;
top[x] = tp;
if(!heavy[x]) return;
dfs2(heavy[x],tp,x);
for(int i = head[x];i;i = l[i].nxt) {
if(l[i].to == from || l[i].to == heavy[x]) continue;
dfs2(l[i].to,l[i].to,x);
}
return;
} inline int lowbit(int x) {
return x & (-x);
} inline void modify(int x,int y,int v) {
for(int i = x;i <= n;i += lowbit(i)) c[i]+=v;
for(int i = y+;i <= n;i += lowbit(i)) c[i]-=v;
return;
} inline int query(int x) {
int res = ;
for(int i = x;i;i -= lowbit(i)) res += c[i];
return res;
} inline void wayadd(int x,int y,int v) {
while(top[x] != top[y]) {
if(deep[top[x]] < deep[top[y]]) swap(x,y);
modify(id[top[x]],id[x],v);
x = fa[top[x]];
}
if(deep[x] > deep[y]) swap(x,y);
modify(id[x],id[y],v);
return;
} int main() {
scanf("%d",&n);
for(int i = ;i <= n;i++) {
scanf("%d",&a[i]);
}
root = a[];
int x,y;
for(int i = ;i < n;i++) {
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs1(root,);
dfs2(root,root,);
for(int i = ;i < n;i++) {
wayadd(a[i],a[i+],);
wayadd(a[i+],a[i+],-);
}
for(int i = ;i <= n;i++) {
printf("%d\n",query(id[i]));
}
return ;
}
[Luogu] P3258 [JLOI2014]松鼠的新家的更多相关文章
- 【luogu P3258 [JLOI2014]松鼠的新家】 题解
题目链接:https://www.luogu.org/problemnew/show/P3258 谁说树剖过不去会RE呢? 我今天就是要强行树剖了 树剖强艹 #include <cstdio&g ...
- P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家
[题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
- 洛谷P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- P3258[JLOI2014]松鼠的新家(LCA 树上差分)
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 题解
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...
随机推荐
- 编译android framework的例子【转】
本文转载自:http://blog.csdn.net/brucexu1978/article/details/7610358 在开发过程中,尤其是Framework相关开发时,有时候需要重新编译资源文 ...
- 一位ACMer过来人的心得(转)
刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解.很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条件. 我觉 ...
- 数据仓库 VS 数据库
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented).集成的(Integrate).相对稳定的(Non-Volatile).反映历史变化(Time Varian ...
- 35. extjs MessageBox里fn:是什么意思
function的缩写,用来指定回调函数,就是你点击确定或取消按钮之类的按钮以后触发的事件Ext.Msg.show({ title:'自定义消息框', msg:'这是一个自定义消息框,想怎么搞就怎么搞 ...
- Linux中的LVM
逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑卷管理的核心是处理安装在系统上的硬盘分区.在逻辑卷管理的世界里,硬盘称作物理卷(Physical ...
- E20171121-sl
contrast n. 对比,对照; 差异; 对照物,对立面; [摄] 反差;
- Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付
- (博弈论)51NOD 1072 威佐夫游戏
有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...
- 论文翻译-SELF TRAINING AUTONOMOUS DRIVING AGENT
文献地址 链接:https://pan.baidu.com/s/1gHrpnOf1FXLp9u8OJ2-oCg 提取码:y2w6 作者 Shashank Kotyan, Danilo Vasconce ...
- random模块思维导图