松鼠的新家

洛谷链接

尽管标签是省选/NOI-,但提交的通过率已经高到三分之一了。

但它仍旧是一个省选/NOI-的题。

大致题意就是按输入的顺序走一棵树,看每个节点经过多少次。问题就相当于把一条链上的所有节点权值都加一,最后统计每个点的权值。

但这样的时间复杂度比较高,所以我们可以把这条链的头节点和尾节点的权值都加一,然后把它们的LCA减一,它们LCA的父亲节点减一。之后每次通记每个节点都统计该节点及其子树的权值和,就是这个节点被经过的次数。

而题目要求在最后的终点不需要计算,所以我们可以把“这条链的头节点和尾节点的权值都加一”,改为“这条链的尾节点的父亲和头节点的权值都加一”,就可以实现题目要求。

 #include<cstdio>
#include<iostream>
#define N 300010
using namespace std;
int next[N*],to[N*],num,head[N],ans[N],size[N],father[N],top[N],sum[N],n,a,b,c,deep[N],haha[N];
void add(int false_from,int false_to){
next[++num]=head[false_from];
to[num]=false_to;
head[false_from]=num;
}
void dfs1(int x){
size[x]=;
deep[x]=deep[father[x]]+;
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]){
father[to[i]]=x;
dfs1(to[i]);
size[x]+=size[to[i]];
}
}
void dfs2(int x){
int mmax=;
if(!top[x])
top[x]=x;
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]&&size[to[i]]>size[mmax])
mmax=to[i];
if(mmax){
top[mmax]=top[x];
dfs2(mmax);
}
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]&&to[i]!=mmax)
dfs2(to[i]);
}
void dfs3(int x){
ans[x]=sum[x];
for(int i=head[x];i;i=next[i])
if(father[x]!=to[i]){
dfs3(to[i]);
ans[x]+=ans[to[i]];
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])
swap(x,y);
x=father[top[x]];
}
if(deep[x]<deep[y])
return x;
return y;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)
scanf("%d",&haha[i]);
for(int i=;i<n;++i){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs1();
dfs2();
for(int i=;i<n;++i){
a=haha[i];
b=haha[i+];
c=lca(a,b);
sum[a]++;
sum[father[b]]++;
sum[c]--;
sum[father[c]]--;
}
dfs3();
for(int i=;i<=n;++i)
printf("%d\n",ans[i]);
return ;
}

P3258 松鼠的新家的更多相关文章

  1. 【题解】P3258松鼠的新家

    [题解][P3258 JLOI2014]松鼠的新家 树链剖分板子题. 总结一点容易写错的地方吧: if(d[top[u]]<d[top[v]]) swap(u,v);注意是\(top\). 在\ ...

  2. 洛谷 P3258 松鼠的新家 题解

    题面 貌似这道题暴力加玄学优化就可以AC? 下面是正解: 1.树链剖分: 我们在u到v之间都放一个糖果,可以将松鼠它家u到v的糖果数都加1.每一次将a[i]到a[i+1] (a数组是访问顺序)的节点加 ...

  3. 洛谷 [P3258] 松鼠的新家

    树上差分 对于一条路径 \(u->v\) 来说,设 \(t=LCA(u,v)\) ,d[]为差分数组 ,则有 d[u]++;d[v]++;d[t]--;d[fa[t]]--; 注意:题目中所给的 ...

  4. 洛谷P3258 松鼠的新家

    树上差分 这应该是一道很简单的树上差分了..就是问每个点被覆盖了多少次. 要注意我们最后dfs后,要把除第一个节点以外的所有点的-1,因为有些点作为起点和终点覆盖了两次,按照题目意思是不用覆盖两次的. ...

  5. 洛谷P3258松鼠的新家

    题目传送门 恩,很明显的一个树剖题,配合树上差分其实也并不难,不过无奈蒟蒻树剖还没那么熟练,而且树上差分也做的少,所以这题愣是做了一中午......唉,果然我还是太菜了.恩,具体做法在代码中解释吧: ...

  6. Luogu P3258 松鼠的新家(树链剖分+线段树/树状数组)

    题面 题解 这种题目一看就是重链剖分裸题,还是区间修改,单点查询,查询之前在遍历时要记一个\(delta\),因为这一次的起点就是上一次的终点,不需要放糖,所以可以用\(BIT\)来写,但我写完\(m ...

  7. BZOJ3631:[JLOI2014]松鼠的新家——题解

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

  8. P3258 [JLOI2014]松鼠的新家

    P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...

  9. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

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

随机推荐

  1. Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bhive.session.id%7D_resources

    原因:环境变量设置问题 <property>    <name>Hive.exec.local.scratchdir</name>    <value> ...

  2. sed.exe 在bat中使用时,需要另外起一个文件

    今天在windows使用sed.exe时,同一个文件死活不生效,然后换了一个bat,再来调用,就可以了,怀疑跟sed.exe的代码有关.有时间再研究

  3. Vue 2.0入门基础知识之全局API

    3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...

  4. JSP报错The value for the useBean class attribute *** is invalid.

    环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...

  5. android动画之android:interpolator属性使用

    android动画之android:interpolator使用 Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerat ...

  6. Android利用已有控件实现自定义控件

    Android控件的基本介绍及使用自定义控件的意义         Android 本身提供了很多控件,自定义控件在android中被广泛运用,自定义控件给了我们很大的方便.比如说,一个视图为imag ...

  7. HttpURLConnection读取http信息

    废话不多说,直接上code. package mytest; import java.io.BufferedReader; import java.io.IOException; import jav ...

  8. Linux上用mvn安装node.js

    Linux上用mvn安装node.js 上一篇blog简略的讲了ubuntu系统的安装,接下来讲讲Ubuntu上的基于node.js的web开发环境的搭建. Node在快速构建网络服务有着极大的优势, ...

  9. ubuntu下php-fpm多实例运行配置

    php-fpm服务一般情况下我们只会配置一个php-fpm了,如果我们碰到要实现多实例php-fpm服务要如何来配置呢,下面一起来看看吧. 这里是在LNMP环境的基础上配置多实例的过程.因为我在使用的 ...

  10. SOE 第五章

    SEO第五章 本次课目标: 1.  掌握代码优化 2.  掌握内链优化 一.代码优化 1)<h>标签 代表网页的标题,总共6个级别(h1-h6) 外观上显示字体的大小的修改,其中<h ...