[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 ...
随机推荐
- 说说循环与闭包——《你不知道的JS》读书笔记(一)
什么是闭包 <你不知道的JS>里有对闭包的定义:"当函数可以记住并访问所在的词法作用域,即使函数是在当前作用域之外执行,这就产生了闭包." 讲闭包是啥的太多了...就一 ...
- go1
关键字: break default func interface select case defer go map struct chan else goto package switch cons ...
- 开源框架 KJFrameForAndroid
一个Android的快速开发工具包,使用它你可以轻松实现网络请求.插件化开发.图片加载等功能.KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化A ...
- dubbo作者讲编码原则
刚看到梁飞谈到dubbo为保证代码质量开发人员必须要注意的,其实也是开发人员应该做的. 1. 防止空指针和下标越界 这是我最不喜欢看到的异常,尤其在核心框架中,我更愿看到信息详细的参数不合法异常, 这 ...
- SQL 存储过程语句拼接愁人的时间类型
http://www.cnblogs.com/yrup/p/4201329.html 解决方法: Select CONVERT(varchar(100), GETDATE(), 25): 2006-0 ...
- Python机器学习算法 — 决策树(Decision Tree)
决策树 -- 简介 决策树(decision tree)一般都是自上而下的来生成的.每个决策或事件(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵 ...
- Unity使用外部版本控制
Using External Version Control Systems with Unity Unity offers an Asset Server add-on product for ea ...
- nat模式下更改网络环境, 虚拟机中Linux无法上网的问题
出现的问题: 1.ifconfig -a 命令下会出现eth0信息中无ip地址等等信息: 2.无法ping通baidu,也就是无法上网: 3.ping 8.8.8.8 提示 connect:netwo ...
- MyEclipse日志文件目录
MyEclipse存放日志的目录为: <Workspace_Root>/.metadata/.log 在该目录下存放了日志的存档和当前日志,通过该日志可以查看MyEclipse的错误信息.
- 转 phpmyadmin操作技巧:如何在phpmyadmin里面复制mysql数据库?
对于每一个站长而言,都会遇到要进行网站测试的时候.这个时候,往往需要备份数据库.如果按照一般的操作方式,都是先把数据库导出并备份到本地,然后再服务器上测试.如果一切正常还好,一旦出了问题,就又得把数据 ...