BZOJ 3910 并查集+线段树合并
思路:
1. 并查集+线段树合并
记得f[LCA]==LCA的时候 f[LCA]=fa[LCA]
2.LCT(并不会写啊...)
//By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=500050; int n,m,xx,yy,a,first[N],next[N*2],v[N*2],tot,deep[N],num[N],f[N],fa[N][20]; long long ans; int lca(int x,int y){if(deep[x]<deep[y])swap(x,y);for(int i=19;~i;i--)if(deep[x]-(1<<i)>=deep[y])x=fa[x][i];if(x==y)return x;for(int i=19;~i;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];return fa[x][0]; } void dfs(int x){for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x][0])deep[v[i]]=deep[x]+1,fa[v[i]][0]=x,dfs(v[i]);} void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;} int dis(int x,int y){return deep[x]+deep[y]-2*deep[lca(x,y)];} int find(int x){return x==f[x]?x:f[x]=find(f[x]);} int main(){memset(first,-1,sizeof(first));scanf("%d%d%d",&n,&m,&a);for(int i=1;i<n;i++){scanf("%d%d",&xx,&yy),add(xx,yy),add(yy,xx);}deep[1]=1,dfs(1);for(int j=1;j<=19;j++)for(int i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];for(int i=1;i<=m;i++)scanf("%d",&num[i]);for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=m;i++){if(find(num[i])==num[i]){int LCA=lca(a,num[i]);ans+=dis(a,num[i]);for(int j=a;deep[j]>deep[LCA];j=find(fa[j][0]))f[j]=LCA;for(int j=num[i];deep[j]>deep[LCA];j=find(fa[j][0]))f[j]=LCA;if(f[LCA]==LCA)f[LCA]=fa[LCA][0];a=num[i];} }printf("%lld\n",ans); }
转载于:https://www.cnblogs.com/SiriusRen/p/6556472.html
BZOJ 3910 并查集+线段树合并相关推荐
- [ONTAK2010]Peaks【并查集+线段树合并】
文章目录 分析 代码 传送门 在Bytemountains有NNN座山峰,每座山峰有他的高度hih_ihi.有些山峰之间有双向道路相连,共MMM条路径,每条路径有一个困难值,这个值越大表示越难走,现 ...
- Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)
题目链接 2016 ACM-ICPC EC-Final Problem G 题意 给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...
- 暑期集训5:并查集 线段树 练习题G: HDU - 1754
2018学校暑期集训第五天--并查集 线段树 练习题G -- HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让 ...
- 暑期集训5:并查集 线段树 练习题F: HDU - 1166
2018学校暑期集训第五天--并查集 线段树 练习题F -- HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...
- 暑期集训5:并查集 线段树 练习题B: HDU - 1213
2018学校暑期集训第五天--并查集 线段树 练习题B -- HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...
- 暑期集训5:并查集 线段树 练习题A: HDU - 1232
2018学校暑期集训第五天--并查集 线段树 练习题A -- HDU - 1232 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅 ...
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
最新文章
- CentOS 5 安装免费虚拟主机管理系统Kloxo
- java replaceall正则表达式_编写高性能Java代码的最佳实践
- 福州3 2五年制计算机专业的学校,福州有哪些五年制大专
- 嵌入式linux面试题解析(四)——逻辑推理一
- 前n个自然数的平方和的求解方法--经典与独创
- OWASP Top 10关键点记录
- Please review your Gradle project setup in the android/ folde
- bzoj 2212 Tree Rotations
- 意图识别 聊天机器人_如何解决聊天机器人中的意图冲突
- ktv服务器管理系统,小型KTV综合解决方案
- JAVA 仿QQ聊天程序(附源码)
- 华为:一个中国民族企业的“下半场”在哪里?
- 初见安~这里是樱狸的博客目录~
- Python学习---综合练习之Craps赌博游戏
- JAVA与C语言的区别之我见
- 计算机概论易错题总结:概念类
- 【计算机科学基础】元宇宙的最新技术、应用和挑战
- 应用与系统稳定性第五篇---Watchdog原理和问题分析
- 汽车电子功能安全标准ISO26262解析(十一)——安全机制
- 2023年经济危机要来了,如何度过这个难关?
热门文章
- sparkshelljarlib_spark-submit 应用程序第三方jar文件
- redis 保存 array list 区别_Redis科普篇
- asp功放怎么装_汽车功放怎么安装 汽车功放安装调试方法【详解】
- oracle表还原truncate,Oracle数据库之Oracle表恢复(truncate)
- 【Docker】 安装 mysql
- mysql将一个字段的值根据逗号拆分_mysql中要根据某个逗号分割的字符串关联查询另一张表的数据...
- 徐州事业单位计算机软件类,徐州计算机办公应用软件
- 转换8421码的程序c语言,16进制数转换成8421BCD编码函数
- python的for语句有几种写法_Python if 和 for 的多种写法
- was升级jdk版本_WebSphere 8.5 升级jdk版本