[BAOJ3631]松鼠的新家
松鼠的新家
题目描述
输入
输出
样例输入
1 4 5 3 2
1 2
2 4
2 3
4 5
样例输出
2
1
2
1
提示
2<= n <=300000
据说是个树链剖分的模板题,可惜,自己不行,字符串都没打完,就没看过树链剖分,就只能靠学过的东西了。很显然这就是个LCA,找到LCA,把两个点到LCA路径上的点都加一就对了,不过这么说LCA会加两次要减一,但是很显然,就算用树上倍增找到LCA,沿路径跳父亲加一也会超时,然后就出现了一个不算特别神奇的神奇的优化,差分思想。
这玩意在学树状数组的时候就学过,当时没整明白,还各种博客的看了好久,才懂了原理,然而并没有什么卵用,换个地方就废了,自己压根就想不到,学过的没办法灵活的根据自己的需要进行修改使用,学的东西死板。
这道题有个坑就是它没根没爹,所以就需要前向星建双向边,那么为了防止死循环就需要标记已经搜索过的边,双向边的话根就爱谁谁了,怎么着建出来的树都是合法的,注意到这些之后就正常的建树,查找LCA就行了(树上倍增),注意好细节就没问题,然后就到差分出场的时候了,怎么差分呢,算是利用树,一直向上传标记吧,那么就需要保证上传的时候只影响从该点到LCA路径上经过的点,把+1传过去,并且LCA只加一次,这么想的话只要在这两个点上+1,把+1标记上传,那路上经过的点就都会得到+1标记,并+1,这时候LCA加两次的问题就出现了,那一个-1就会抵消掉多加的一,这时候路径上的点就都搞定了,可是LCA上加一的点还会传给它的父亲,那同理给他的父亲也-1这件事情就完美解决了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #define maxn 300050 6 using namespace std; 7 struct shu{ 8 int zhong,qian; 9 }qxx[2*maxn]; 10 int n,js,m; 11 int a[maxn],head[maxn],tg[maxn],deep[maxn],pd[maxn]; 12 int f[maxn][30]; 13 void add(int u,int v) 14 { 15 qxx[++js].zhong=v; 16 qxx[js].qian=head[u]; 17 head[u]=js; 18 return ; 19 } 20 void dfsf(int x) 21 { 22 pd[x]=1; 23 for(int i=head[x];i;i=qxx[i].qian) 24 { 25 int ls=qxx[i].zhong; 26 if(pd[ls]==0) 27 { 28 deep[ls]=deep[x]+1; 29 f[ls][0]=x; 30 for(int j=1;j<=m;++j) 31 f[ls][j]=f[f[ls][j-1]][j-1]; 32 dfsf(ls); 33 } 34 } 35 return ; 36 } 37 int lca(int x,int y) 38 { 39 if(deep[x]>deep[y]) swap(x,y); 40 for(int i=m;i>=0;--i) 41 if(deep[f[y][i]]>=deep[x]) y=f[y][i]; 42 if(x==y) return x; 43 for(int i=m;i>=0;--i) 44 if(f[x][i]!=f[y][i]) 45 { 46 x=f[x][i]; 47 y=f[y][i]; 48 } 49 return f[x][0]; 50 } 51 void dfs(int x) 52 { 53 pd[x]=1; 54 for(int i=head[x];i;i=qxx[i].qian) 55 { 56 int ls=qxx[i].zhong; 57 if(pd[ls]==0) 58 { 59 dfs(ls); 60 tg[x]+=tg[ls]; 61 } 62 } 63 return ; 64 } 65 int main() 66 { 67 scanf("%d",&n); m=(int)(log(n)/log(2))+2; 68 for(int i=1;i<=n;++i) scanf("%d",&a[i]); 69 for(int i=1;i<n;++i) 70 { 71 int x,y; scanf("%d%d",&x,&y); 72 add(x,y); add(y,x); 73 } 74 deep[1]=1; dfsf(1); 75 memset(pd,0,sizeof(pd)); 76 for(int i=1;i<n;++i) 77 { 78 int ls=lca(a[i],a[i+1]); 79 tg[a[i]]+=1; tg[a[i+1]]+=1; 80 tg[ls]-=1; tg[f[ls][0]]-=1; 81 } 82 dfs(1); 83 tg[a[1]]++; 84 for(int i=1;i<=n;++i) printf("%d\n",tg[i]-1); 85 return 0; 86 }
View Code
转载于:https://www.cnblogs.com/hzjuruo/p/11296007.html
[BAOJ3631]松鼠的新家相关推荐
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
- P3258 [JLOI2014]松鼠的新家(树上点查分)
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上. ...
- P3258 [JLOI2014]松鼠的新家
文章目录 题意: 题解: 树上差分 代码: 树链剖分 代码: P3258 [JLOI2014]松鼠的新家 题意: n个点,n-1条边,给出每个点的拜访顺序,问每个点经过几次(最后一次移动不算拜访) 题 ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 3631: [JLOI2014]松鼠的新家
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 707 Solved: 342 [Submit][Sta ...
- bzoj 3631: [JLOI2014]松鼠的新家(LCA+树上差分)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2059 Solved: 1030 [Submit][S ...
- Luogu_P3258 松鼠的新家
松鼠的新家 链接 Luogu_P3258 松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有nnn个房间,并且有n−1n-1n−1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...
- 刷题总结——松鼠的新家(bzoj3631)
题目: Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在" ...
- 松鼠的新家(树上点差分 + LCA)
题目: 松鼠的新家是一棵树,前几天刚刚装修好了新家,新家有 个房间,并且有 根树枝连接,每个房间都可以相互到达,且任两个房间之间的路线都是唯一的.天哪,他居然真的住在「树」上.松鼠想邀请小熊维尼前来参 ...
最新文章
- 最长公共上升子序列 LCIS
- MySQL夺命连环12问
- 谷歌自动驾驶是个大坑,还好中国在构建自己的智能驾驶大系统
- 推荐系统算法工程师培养计划:博导级教研团队,原理教学、项目实践、大厂内推的一站式培训...
- 【Linux】【Services】【Package】rpm
- 伸缩轨道_深度解析——伸缩喷漆房为什么这么受欢迎!
- 【Excel】使用VLOOKUP+IF实现多列条件匹配查询
- opencv图像分析与处理(14)- 图像压缩基础知识
- Atitit 图像处理的摩西五经attilax总结
- 阿里云Landing Zone系列--1云治理中心使用
- 中科院各大计算所详细介绍
- 网络通信中 TCP 产生 RST 的三个条件分析
- 华硕员工长篇记实:天堂向左,华硕往右
- 登陆港股市场,阳光保险的 “价值锚点”
- C++大作业--班级同学信息管理系统
- 五、量子纠错编码的原理
- 计算机的冷启动与热启动
- zabbix的mysql模板_使用Zabbix自带MySQL模板监控MySQL
- CR2格式批量转换JPG(美图看看)
- 【PIC32MZ】开发环境的搭建
热门文章
- html中div被挤下来,css+div左右布局没效果,右边的被挤到底部_html/css_WEB-ITnose
- 论文笔记(十七):Brax - A Differentiable Physics Engine for Large Scale Rigid Body Simulation
- Android必知必会-自定义Scrollbar样式
- oracle 查询temporary table,Oracle临时表(Temporary Table)
- Codeforces Round #695 (Div. 2)ABCD题解详析
- 当你程序运行出现错时~
- 聊下图片滤镜,手机上的,lookup table(颜色查找表
- Android技术点汇总
- Spring websocket+Stomp+SockJS 实现实时通信 详解
- cogs 998. [東方S2] 帕秋莉·诺蕾姬