思路:

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 并查集+线段树合并相关推荐

  1. [ONTAK2010]Peaks【并查集+线段树合并】

    文章目录 分析 代码 传送门 在Bytemountains有NNN座山峰,每座山峰有他的高度hih_ihi​.有些山峰之间有双向道路相连,共MMM条路径,每条路径有一个困难值,这个值越大表示越难走,现 ...

  2. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  3. 暑期集训5:并查集 线段树 练习题G: HDU - 1754

    2018学校暑期集训第五天--并查集 线段树 练习题G  --   HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让 ...

  4. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题F  --   HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  5. 暑期集训5:并查集 线段树 练习题B: HDU - 1213 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题B  --   HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...

  6. 暑期集训5:并查集 线段树 练习题A:  HDU - 1232 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题A  --   HDU - 1232 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅 ...

  7. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

  8. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  9. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

最新文章

  1. CentOS 5 安装免费虚拟主机管理系统Kloxo
  2. java replaceall正则表达式_编写高性能Java代码的最佳实践
  3. 福州3 2五年制计算机专业的学校,福州有哪些五年制大专
  4. 嵌入式linux面试题解析(四)——逻辑推理一
  5. 前n个自然数的平方和的求解方法--经典与独创
  6. OWASP Top 10关键点记录
  7. Please review your Gradle project setup in the android/ folde
  8. bzoj 2212 Tree Rotations
  9. 意图识别 聊天机器人_如何解决聊天机器人中的意图冲突
  10. ktv服务器管理系统,小型KTV综合解决方案
  11. JAVA 仿QQ聊天程序(附源码)
  12. 华为:一个中国民族企业的“下半场”在哪里?
  13. 初见安~这里是樱狸的博客目录~
  14. Python学习---综合练习之Craps赌博游戏
  15. JAVA与C语言的区别之我见
  16. 计算机概论易错题总结:概念类
  17. 【计算机科学基础】元宇宙的最新技术、应用和挑战
  18. 应用与系统稳定性第五篇---Watchdog原理和问题分析
  19. 汽车电子功能安全标准ISO26262解析(十一)——安全机制
  20. 2023年经济危机要来了,如何度过这个难关?

热门文章

  1. sparkshelljarlib_spark-submit 应用程序第三方jar文件
  2. redis 保存 array list 区别_Redis科普篇
  3. asp功放怎么装_汽车功放怎么安装 汽车功放安装调试方法【详解】
  4. oracle表还原truncate,Oracle数据库之Oracle表恢复(truncate)
  5. 【Docker】 安装 mysql
  6. mysql将一个字段的值根据逗号拆分_mysql中要根据某个逗号分割的字符串关联查询另一张表的数据...
  7. 徐州事业单位计算机软件类,徐州计算机办公应用软件
  8. 转换8421码的程序c语言,16进制数转换成8421BCD编码函数
  9. python的for语句有几种写法_Python if 和 for 的多种写法
  10. was升级jdk版本_WebSphere 8.5 升级jdk版本