bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)
题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍
可以树链剖分,也可以直接在树上做差分序列的标记
后者打起来更舒适一点。。
具体实现:
先求x,y的lca,且dep[x]<dep[y],
如果在一棵子树下的一条链上,那么lca就是x
则g[fa[x]]--; g[y]++;
如果在一棵子树的两条分枝上,那么lca设为z
g[x]++, g[y]++, g[z]--, g[fa[z]]--
最后从叶子节点加回根节点,加法是差分序列的那种加法
因为z会加左右两边,多加了1,所以要减去。
#include<stdio.h>
#include<algorithm>
using namespace std;
;
struct node{
int to,next;
}e[maxn*];
],w[maxn],f[maxn],tot,logn;
void insert(int u, int v){
e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
}
void dfs(int u, int f, int d){
dep[u]=d; fa[u][]=f;
; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
for (int i=head[u]; i; i=e[i].next)
);
}
void lca(int u, int v){
if (dep[u]<dep[v]) swap(u,v);
int x=u,y=v;
while (dep[u]>dep[v]){
; i--)
if (dep[fa[u][i]]>dep[v])
u=fa[u][i];
u=fa[u][];
}
if (u==v){ //在某条链上
w[fa[u][]]--;
w[x]++;
return;
}
; i--) //在分叉口上
if (fa[u][i]!=fa[v][i]){
u=fa[u][i];
v=fa[v][i];
}
u=fa[u][];
w[x]++; w[y]++;
w[u]--; w[fa[u][]]--;
return;
}
void get_ans(int u){
f[u]=w[u];// printf(" %d\n", w[u]);
for (int i=head[u],v; i; i=e[i].next){
]) continue;
get_ans(e[i].to);
f[u]+=f[v];
}
}
int main(){
scanf("%d", &n);
; i<=n; i++) scanf(; <<logn)<n) logn++;
,u,v; i<n; i++) scanf(,a[]);
dfs(,,);
; i<=n; i++){
lca(a[i-],a[i]);
}
get_ans(a[]);
; i<=n; i++) printf(])?f[i]:f[i]-);
;
}
bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)的更多相关文章
- 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...
- bzoj3631 [JLOI2014]松鼠的新家——树上差分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...
- [JLOI2014] 松鼠的新家 (lca/树上差分)
[JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在 ...
- P3258[JLOI2014]松鼠的新家(LCA 树上差分)
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- [Bzoj3631][JLOI2014]松鼠的新家 (树上前缀和)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2350 Solved: 1212[Submit][Sta ...
- [BZOJ3631]:[JLOI2014]松鼠的新家(LCA+树上差分)
题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- BZOJ3631 [JLOI2014]松鼠的新家 【树上差分】
题目 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松鼠想 ...
- BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- bzoj3631[JLOI2014 松鼠的新家 倍增lca+差分
裸的树上差分+倍增lca 每次从起点到终点左闭右开,这就有一个小技巧,要找到右端点向左端点走的第一步,然后差分就好了 #include<cstdio> #include<cstrin ...
随机推荐
- LocalDB 静默安装
cmd命令:msiexec /i SqlLocalDB.msi /qn IACCEPTSQLLOCALDBLICENSETERMS=YES 注意:需要以管理员身份运行
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- expect
#!/usr/bin/expect -fset ipaddr "192.168.5.4"set passwd "123qwe"set timeout 30 sp ...
- mybatis 配置连接池
<!-- 配置数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidData ...
- iOS动画效果和实现
动画效果提供了状态或页面转换时流畅的用户体验,在iOS系统中,咱们不需要自己编写绘制动画的代码,Core Animation提供了丰富的api来实现你需要的动画效果. UIKit只用UIView来展示 ...
- C and SQL data types for ODBC and CLI
C and SQL data types for ODBC and CLI This topic lists the C and SQL data types for ODBC and CLI a ...
- [Linux] 查看jar包内容
jar vtf fileName.jar 用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] file ...
- 利用C# Winform做Windows系统任务栏
最近公司做一个考试系统,需要一个答题栏,要求:占用屏幕上方一部分区域,而且始终置顶,当其他窗口最大化时"答题栏"始终置前并且不遮挡最大化窗口的任何部分!就像windows任务栏一样 ...
- 控制台查看原生sql
情况:当tomcat运行时,项目运行过程中,控制台没有打印出原生sql语句: 解决办法如下: 在 META-INF 文件夹下,查找 persistence.xml 这个文件(这里注意可能一个项目不止 ...
- CVE-2010-3654分析及利用
三年前分析的一个漏洞,最近又温习一遍,这个flash中混淆漏洞的鼻祖,10年最经典的漏洞. 漏洞触发原因 该漏洞主要因为avm对返回的类没有进行校验,通过修改swf文件,实现Ref类和Origin类的 ...