BZOJ3631[JLOI2014]松鼠的新家 题解

时间:2022-09-01 15:58:33

题目大意:

  给你一棵树,要从编号为a[1]的节点走到编号为a[2]的节点再走到编号为a[3]的节点……一直走到编号为a[n]的节点。问每个节点最少访问多少次。

思路:

  将其进行轻重链剖分,则从a[i]走到a[i+1]实际上就是在几段重链的节点上+1,于是就用线段树来维护一下即可。

代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1200000
using namespace std; int ans[M],to[M],head[M],next[M],vis[M],size[M],deep[M],id[M],top[M],sum[M],fa[M],a[M],cnt,dfn,n; void add(int x,int y)
{
to[++cnt]=y;
next[cnt]=head[x];
head[x]=cnt;
} void dfs1(int x)
{
size[x]=vis[x]=;
for (int i=head[x];i;i=next[i])
if (!vis[to[i]])
{
deep[to[i]]=deep[x]+;
fa[to[i]]=x;
dfs1(to[i]);
size[x]+=size[to[i]];
}
} void dfs2(int x,int chain)
{
int k=,i;
id[x]=++dfn;
top[x]=chain;
for (i=head[x];i;i=next[i])
if (deep[to[i]]>deep[x] && size[to[i]]>size[k]) k=to[i];
if (!k) return;
dfs2(k,chain);
for (i=head[x];i;i=next[i])
if (deep[to[i]]>deep[x] && to[i]!=k) dfs2(to[i],to[i]);
} void push_down(int cur)
{
sum[cur<<]+=sum[cur];
sum[cur<<|]+=sum[cur];
sum[cur]=;
} void ADD(int L,int R,int l,int r,int cur)
{
if (l<=L && r>=R)
{
sum[cur]++;
return;
}
push_down(cur);
int mid=L+R>>;
if (l>mid) ADD(mid+,R,l,r,cur<<|);
else if (r<=mid) ADD(L,mid,l,r,cur<<);
else ADD(L,mid,l,mid,cur<<),ADD(mid+,R,mid+,r,cur<<|);
} int ask(int l,int r,int x,int cur)
{
if (l==r) return sum[cur];
push_down(cur);
int mid=l+r>>;
if (x>mid) return sum[cur]+ask(mid+,r,x,cur<<|);
else return sum[cur]+ask(l,mid,x,cur<<);
} void Add(int x,int y)
{
for (;top[x]!=top[y];x=fa[top[x]])
{
if (deep[top[x]]<deep[top[y]]) swap(x,y);
ADD(,n,id[top[x]],id[x],);
}
if (deep[x]<deep[y]) swap(x,y);
ADD(,n,id[y],id[x],);
} int main()
{
int i,x,y;
scanf("%d",&n);
for (i=;i<=n;i++) scanf("%d",&a[i]);
for (i=;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
dfs1();
dfs2(,);
for (i=;i<n;i++) Add(a[i],a[i+]);
for (i=;i<=n;i++)
{
ans[i]=-(i!=a[]);
ans[i]+=ask(,n,id[i],);
}
for (i=;i<=n;i++) printf("%d\n",ans[i]);
return ;
}

BZOJ3631[JLOI2014]松鼠的新家 题解的更多相关文章

  1. &lbrack;Bzoj3631&rsqb;&lbrack;JLOI2014&rsqb;松鼠的新家 (树上前缀和)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2350  Solved: 1212[Submit][Sta ...

  2. 洛谷 P3258 &lbrack;JLOI2014&rsqb;松鼠的新家 题解

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

  3. luoguP3258 &lbrack;JLOI2014&rsqb;松鼠的新家 题解&lpar;树上差分&rpar;

    P3258 [JLOI2014]松鼠的新家  题目 树上差分:树上差分总结 #include<iostream> #include<cstdlib> #include<c ...

  4. BZOJ3631:&lbrack;JLOI2014&rsqb;松鼠的新家——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3631 https://www.luogu.org/problemnew/show/P3258 松鼠的 ...

  5. BZOJ3631 &lbrack;JLOI2014&rsqb;松鼠的新家 【树上差分】

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

  6. &lbrack;BZOJ3631&rsqb;&colon;&lbrack;JLOI2014&rsqb;松鼠的新家(LCA&plus;树上差分)

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

  7. P3258 &lbrack;JLOI2014&rsqb;松鼠的新家题解

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

  8. &lbrack;BZOJ3631&rsqb;&lbrack;JLOI2014&rsqb;松鼠的新家(树链剖分)

    [BZOJ3631] 树剖模板题了, Code #include <cstdio> #include <algorithm> #define MID int mid=(l+r) ...

  9. bzoj3631&colon; &lbrack;JLOI2014&rsqb;松鼠的新家(LCA&plus;差分)

    题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍 可以树链剖分,也可以直接在树上做差分序列的标记 后者打起来更舒适一点.. 具体实现: 先求x,y的lca,且dep[x]<dep[y] ...

随机推荐

  1. 图片懒加载--判断div ul中的li是否已经滑动到可视区域里

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. 哈夫曼树&lpar;三&rpar;之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  3. 1&period;1 让CPU占用率曲线听你指挥&lbrack;cpu manager&rsqb;

    [本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manag ...

  4. PHP学习笔记 - 进阶篇(5)

    PHP学习笔记 - 进阶篇(5) 正则表达式 什么叫正则表达式 正则表达式是对字符串进行操作的一种逻辑公式,就是用一些特定的字符组合成一个规则字符串,称之为正则匹配模式. $p = '/apple/' ...

  5. 自定义控件之圆形颜色渐变进度条--SweepGradient

    前几天在群里面有人找圆形可颜色渐变进度条,其中主要的知识点是SweepGradient: mSweepGradient = new SweepGradient(240, 360, new int[] ...

  6. kafka 集群搭建

    环境:ubuntu14.04 版本:jdk1.8,zookeeper 3.4.10,kafka 2.11 搭建步骤: 1. 搭建zookeeper集群 参考链接:zookeeper集群搭建 2. 下载 ...

  7. InkImageDataSetGenerator-开源一个可用于机器学习的书写轨迹图片生成的小工具

    这是一个简单易用的图片数据集生成小工具,基于OpenCV和UWP Ink API,它可以根据指定的手写轨迹生成一系列各个角度的图片.每张图片的尺寸和总体数量都是可以指定的,均存放在统一的生成目录中.h ...

  8. bash&colon; lspci&colon; command not found解决方法

    在CentOS虚拟机使得lspci查看硬件信息.使用时,提示bash: lspci: command not found,大多使用/sbin/lspci即可,我发现我的系统中/sbin下也没有.使用y ...

  9. Java 数据库程序设计

    数据库基础 目前,大多数数据库系统都是关系数据库系统(relational database system).该数据库系统是基于关系数据模型的,这个模型有三个要素:结构.完整性和语言 结构(struc ...

  10. odoo TransientModels must have log&lowbar;access turned on