P3285 松鼠的新家 (树链剖分)
题目描述
松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的。天哪,他居然真的住在”树“上。
松鼠想邀请小熊维尼前来参观,并且还指定一份参观指南,他希望维尼能够按照他的指南顺序,先去a1,再去a2,......,最后到an,去参观新家。可是这样会导致维尼重复走很多房间,懒惰的维尼不停地推辞。可是松鼠告诉他,每走到一个房间,他就可以从房间拿一块糖果吃。
维尼是个馋家伙,立马就答应了。现在松鼠希望知道为了保证维尼有糖果吃,他需要在每一个房间各放至少多少个糖果。
因为松鼠参观指南上的最后一个房间an是餐厅,餐厅里他准备了丰盛的大餐,所以当维尼在参观的最后到达餐厅时就不需要再拿糖果吃了。
输入输出格式
输入格式:
第一行一个整数n,表示房间个数第二行n个整数,依次描述a1-an接下来n-1行,每行两个整数x,y,表示标号x和y的两个房间之间有树枝相连。
输出格式:
一共n行,第i行输出标号为i的房间至少需要放多少个糖果,才能让维尼有糖果吃。
输入输出样例
5
1 4 5 3 2
1 2
2 4
2 3
4 5
1
2
1
2
1
说明
2<= n <=300000
因为这个题,只要最后面查询,所以可以用树状数组的区间修改来做,所以,上代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define ll(x) (x*2)
#define rr(x) (x*2+1)
#define lol long long
using namespace std;
const int maxn=; lol read()
{
char ch=getchar();lol f=,w=;
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch<=''&&ch>=''){w=w*+ch-'';ch=getchar();}
return f*w;
} struct sj{
lol to;
lol next;
}a[maxn*];
lol head[maxn],size;
lol vis[maxn],js[maxn],n;
lol top[maxn],son[maxn],num[maxn];
lol id[maxn],dep[maxn],fa[maxn];
lol c[maxn],nat[maxn]; void add(lol x,lol y)
{
a[++size].to=y;
a[size].next=head[x];
head[x]=size;
} void dfs(lol rt,lol pre,lol deep)
{
dep[rt]=deep;
num[rt]=;
fa[rt]=pre;
for(int i=head[rt];i;i=a[i].next)
{
lol tt=a[i].to;
if(tt!=fa[rt])
{
dfs(tt,rt,deep+);
num[rt]+=num[tt];
if(num[tt]>num[son[rt]])
son[rt]=tt;
}
}
} int dfn;
void dfs_find(lol rt,lol zu)
{
dfn++;
top[rt]=zu;
id[rt]=dfn;
if(son[rt]!=-)
dfs_find(son[rt],zu);
for(int i=head[rt];i;i=a[i].next)
{
lol tt=a[i].to;
if(tt!=son[rt]&&tt!=fa[rt])
{
dfs_find(tt,tt);
}
}
return;
} int lowbit(int x)
{
return x&(-x);
} void insert(int x,int z)
{
for(int i=x;i<=n;i+=lowbit(i))
{if(i==)break;c[i]+=z;}
} int check(int x)
{
int sum=;
for(int i=x;i>=;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
} void change(int s,int t) //change 还有一点小问题 没有剪掉起点
{
while(top[s]!=top[t])
{
if(dep[top[s]]<dep[top[t]])
swap(s,t);
insert(id[top[s]],);
insert(id[s]+,-);
s=fa[top[s]];
}
if(id[s]>id[t])
swap(s,t);
insert(id[s],);
insert(id[t]+,-);
return;
} int main()
{
memset(son,-,sizeof(son));
memset(top,-,sizeof(top));
n=read();
for(int i=;i<=n;i++)
vis[i]=read();
for(int i=;i<n;i++)
{
lol x,y;
x=read(); y=read();
add(x,y); add(y,x);
}
dfs(,,); dfs_find(,);
js[vis[]]+=; js[vis[n]]-=;
for(int i=;i<n;i++)
{
change(vis[i],vis[i+]);
js[vis[i]]-=;
}
for(int i=;i<=n;i++)
{
lol ss;
ss=check(id[i]);
ss+=js[i];
cout<<ss<<endl;
}
return ;
}
P3285 松鼠的新家 (树链剖分)的更多相关文章
- BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )
裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...
- 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)
题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...
- BZOJ3631 松鼠的新家(树链剖分)
题目链接 松鼠的新家 差不多可以说是树链剖分的模板题了,直接维护即可. #include <bits/stdc++.h> using namespace std; #define REP( ...
- 【BZOJ3631】松鼠的新家 树链剖分
BZOJ3631 松鼠的新家 Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- P3258 [JLOI2014]松鼠的新家 树链剖分
这个题就是一道树剖板子题,就是每走一步就把所有的经过点加一就行了.还有,我的树剖板子没问题!!!谁知道为什么板子T3个点!我不管了!反正这道题正常写A了. 题干: 题目描述 松鼠的新家是一棵树,前几天 ...
- Bzoj 3631: [JLOI2014]松鼠的新家(树链剖分+线段树)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...
- BZOJ - 3631 松鼠的新家 (树链剖分)
题目链接 树链剖分基础题,路径权值修改+差分 #include<bits/stdc++.h> using namespace std; typedef long long ll; ; in ...
- BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分
传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...
随机推荐
- 解决ubuntu上ifconfig没有eth0/ens33且无法上网的问题
ifconfig只有一个轮回端口lo,没有我们的网卡eth0,一开始以为是vsphere(新手对于vsphere不是很熟悉)上我的虚拟机配置问题,还查看了相关的网络配置,后来才知道是因为: 问题出在配 ...
- web.xml 中 resource-ref 的注意事项
配置说明: web.xml 中配置 <resource-ref> <description>Employees Database for HR Applications< ...
- SAP HANA
DROP PROCEDURE ""."ZCONCAT_EKKO_EBN"; CREATE PROCEDURE ""."ZCONCA ...
- Python基础学习总结__Day3
一.集合 1.特性:无序且天生去重,格式为{} 2.作用: (1)去重 (2)关系测试 3.可调用函数(常见对列表操作) (1)取交集:A.intersection(B) (2)取并集:A.union ...
- leetcode-11-dfs
DFS算法: explore(G, v) visited(v) = trueprevisit(v) for each edge(v, u) in E: if not visited(u): explo ...
- Java并发编程的艺术 记录(二)
volatile的应用 volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量.Java语言提供了volatil ...
- jenkins执行构建并查看结果
继完成构建项目配置http://www.cnblogs.com/yajing-zh/p/5111060.html后,则要执行构建. 回到jenkins主页之后,我们看到一个新建的项目显示出来: 点击进 ...
- <原创> 通过PEB获得进程路径 (附完整工程)
完整工程:http://files.cnblogs.com/files/Gotogoo/%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86%E5%99%A8%28x86%26%2 ...
- HDU 5399 数学 Too Simple
题意:有m个1~n的映射,而且对于任意的 i 满足 f1(f2(...fm(i))) = i 其中有些映射是知道的,有些是不知道的,问一共有多少种置换的组合. 分析: 首先这些置换一定是1~n的一个置 ...
- JavaScript: 2015 年回顾与展望
链接:http://www.sitepoint.com/javascript-2015-review/ JavaScript经历了一个不平凡的一年.尽管到5月份已经20年了,关于JS的新闻.项目和兴趣 ...