【Luogu P3258】[JLOI2014]松鼠的新家
Luogu P3258
题意就是对于一棵树,要求按照给出的顺序对每一个节点进行访问,记录每一个节点被经过的次数;特别地,我们认为只有从一个节点往外走才能被认为是经过一次。(最后一句话非常重要,仔细理解题意)
前置知识:树链剖分,差分。
最开始看到这道题我是打算使用树链剖分+线段树来做的。
但是我发现这个答案只需要每一个房间的糖果数……也就是说只需要区间修改+单点查询。
如果使用线段树的话,可能造成大量的空间浪费,而且常数也不小。
所以,我选择了使用树链剖分+差分进行统计。
由于差分写得比较少,本人卡了好一会。
大致思路如下:对于\(a[i-1]\)和\(a[i]\)两个节点,利用树链剖分求出两者之间的路径。
其实就是树剖求\(LCA\),每次比较两点的链头深度,深度大的往上跳,直至两点位于同一重链上。
把经过的每一个点权\(+1\),终点会被重复统计,所以每一次处理完毕都要让终点\(-1\)。
#include<cstdio>
#include<algorithm>
using namespace std;
struct data
{
int to,next;
}e[600005];
int head[300005],cnt,size[300005],fa[300005],d[300005],top[300005];
int a[300005],ans[3000005],id[300005],tim,wson[300005],n;
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dfs1(int u,int f,int de)
{
size[u]=1;
fa[u]=f;
d[u]=de;
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if (v==f) continue;
dfs1(v,u,de+1);
size[u]+=size[v];
if (size[wson[u]]<size[v]) wson[u]=v;
}
}
void dfs2(int u,int t)
{
top[u]=t;
id[u]=++tim;
if (wson[u]) dfs2(wson[u],t);
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if (v==fa[u]||v==wson[u]) continue;
dfs2(v,v);
}
}
void lca(int x,int y)
{
if (d[top[x]]<d[top[y]]) swap(x,y);
while (top[x]!=top[y])
{
if (d[top[x]]<d[top[y]]) swap(x,y);
ans[id[top[x]]]+=1;ans[id[x]+1]-=1;
x=fa[top[x]];
}
if (d[x]<d[y]) swap(x,y);
ans[id[y]]+=1;ans[id[x]+1]-=1;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs1(1,0,1);
dfs2(1,1);
for (int i=2;i<=n;i++)
{
lca(a[i],a[i-1]);
ans[id[a[i]]]--;
ans[id[a[i]]+1]++;
//注意dfs序和原编号的映射关系
}
for (int i=1;i<=n;i++)
ans[i]+=ans[i-1];//用差分数组求出答案数组
for (int i=1;i<=n;i++) printf("%d\n",ans[id[i]]);
return 0;
}
【Luogu P3258】[JLOI2014]松鼠的新家的更多相关文章
- [Luogu] P3258 [JLOI2014]松鼠的新家
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...
- 【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 ...
随机推荐
- 16、job触发流程原理剖析与源码分析
一.以Wordcount为例来分析 1.Wordcount val lines = sc.textFile() val words = lines.flatMap(line => line.sp ...
- UOJ226. 【UR #15】奥林匹克环城马拉松 [组合数学,图论]
UOJ 思路 我们知道关于有向图欧拉回路计数有一个结论:在每个点入度等于出度的时候,答案就是 \[ t_w(G)\prod (deg_i-1)! \] 其中\(t_w(G)\)是以某个点为根的树形图个 ...
- 金蝶kis 16.0专业版-破解01
Kingdee.KIS.MobAppSer>MainViewModel 经过反混淆后,找到导入LIcense文件后的验证函数. 下面仅需进行逆向生成即可,为什么一定要进行生成lic文件方式进行破 ...
- 对象+String
public class Fruit { public String toString() { return "Fruit toString."; } public static ...
- jquery选择器(1)
jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...
- ICEM-带把圆环
原视频下载地址:https://pan.baidu.com/s/1pKSXyR5 密码: dynm
- vue element-UI 多个 select 回显成功,但是选中无反应
参考文章 vue开发(四)element的select下拉框设定初值后,不能重新选择的问题 参考文章 element模态框dialog中的select组件中选中无反应 原因 下拉框数据是循环别的接口得 ...
- 【微信小程序】scroll-view 的上拉加载和下拉刷新
1.在微信小程序中,想到 下拉刷新 和 上拉加载,如果是整个页面都拖动的话,可以在页面配置中,配置 enablePullDownRefresh 和 onReachBottomDistance 然后在 ...
- GIS空间分析案例教程——带背景和周围要素的逐要素导出地理
GIS空间分析案例教程--带背景和周围要素的逐要素导出地理 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 目的:导出多边形要素类的每个要素 实 ...
- layui 鼠标悬停单元格显示全部
{field : 'subjectId',title : '主题id',align: 'center',edit : 'text',templet:'<div><span title ...