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 ...
随机推荐
- RecyclerView解密篇(三)
在上一篇(RecyclerView使用详解(二))文章中介绍了RecyclerView的多Item布局实现,接下来要来讲讲RecyclerView的Cursor实现,相较于之前的实现,Cursor有更 ...
- 【python】nuitka封装python
官网:http://nuitka.net/doc/user-manual.html python打包工具对比:http://blog.csdn.net/qwemicheal/article/detai ...
- php Your system does not support any of these drivers: gmagick,imagick,gd2
缺少这些库时,安装 : apt-get install php5-gd 就可以.
- C++ 系列:多线程编程基础知识
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- vim简明教程
在shell中新建一个文件 # vim a.txt vim有三种模式:一般模式.插入模式.底行模式 三种工作模式 1.命令模式 移动光标 hjkl yy 复制 nyy 从光标向下复制n行 0 移动光标 ...
- 产品经理 - 移动支付+Pos收单分析
产品经理 - 移动支付+Pos收单分析
- Flex Layout Attribute
GitHub: https://github.com/StefanKovac/flex-layout-attribute 引入基本的样式,可以更好的布局,可以在线制作: http://progress ...
- Shell_1 简介
1 Shell 变量 只读变量 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变. #!/bin/bash -x varName="AAA" echo ...
- 截取QueryString 通过截取?和& 小写
$(function () { var url = location.href.replace("#", ""); var paraString = url.s ...
- jQuery页面加载初始化的3种方法
jQuery 页面加载初始化的方法有3种 ,页面在加载的时候都会执行脚本,应该没什么区别,主要看习惯吧,本人觉得第二种方法最好,比较简洁. 第一种: $(document).ready(functio ...