本题并不需要并查集,每次查询一次最近公共祖先,并倍增求出需要被新标记的路径。

这样保证时间复杂度是 O(nlogn)O(nlogn)O(nlogn) 的。

Code:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 500000 + 4;
const int logn = 21;
int f[25][maxn], head[maxn], to[maxn << 1], nex[maxn << 1], cnt, n, m, s, dep[maxn];
bool tag[maxn];
long long ans;
inline void add_edge(int u,int v){
nex[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
}
void dfs(int u,int fa, int depth)
{
f[0][u] = fa, dep[u] = depth;
for(int v = head[u]; v ; v = nex[v]){
if(to[v] != fa){
dfs(to[v], u, depth + 1);
}
}
}
inline int lca(int a,int b){ //b向 a 爬
if(dep[a] > dep[b]) swap(a,b);
if(dep[a] != dep[b]){
for(int i = logn;i >= 0; --i)
if(dep[f[i][b]] >= dep[a]) b = f[i][b];
}
if(a == b) return a;
for(int i = logn;i >= 0; --i)
{
if(f[i][a] != f[i][b])
{
a = f[i][a], b = f[i][b];
}
}
return f[0][a];
}
inline void connect(int a, int b){
if(tag[a] && tag[b]) return ;
if(dep[a] < dep[b]) swap(a, b); //a 爬向 b
int A = a;
if(tag[A])
{
for(int i = logn;i >= 0;--i)
if(tag[f[i][a]] == 1 ) a = f[i][a];
}
do
{
tag[a] = tag[f[0][a]] = 1;
a = f[0][a];
}while(a != b);
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i = 1;i < n ; ++i){
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
dfs(1, 0, 1);
for(int i = 1;i <= logn; ++i)
for(int j = 1;j <= n; ++j)
f[i][j] = f[i - 1][f[i - 1][j]];
int pre = s;
for(int i = 1;i <= m; ++i){
int cur;
scanf("%d",&cur);
int h = lca(pre, cur);
if(tag[cur] && tag[pre]) continue;
ans +=(long long) dep[cur] + dep[pre] - 2 * dep[h];
connect(pre, h);
connect(cur, h);
pre = cur;
}
printf("%lld",ans);
return 0;
}

最新文章

  1. mybatis xml 中的特殊符转义字符号和模糊查询
  2. 【JS复习笔记】07 复习感想
  3. 用R语言分析我的fitbit计步数据
  4. ArcGIS API for JavaScript开发环境搭建及第一个实例demo
  5. sql 表连接 join
  6. 理解Node.js事件驱动编程
  7. (转)php中__autoload()方法详解
  8. acdream 1154 Lowbit Sum
  9. OC 中的block使用
  10. 转: git常用命令
  11. benchmark 库
  12. html自定义调控
  13. HDU 1724 Ellipse [辛普森积分]
  14. Node.js微服务实践(一)
  15. 报错:Maximum call stack size exceeded
  16. include与__autoload与命名空间namespace与PSR4详解
  17. TestNg-数据驱动-dataProvider
  18. Cordova打包Apk
  19. Hadoop 系列(三)Java API
  20. map &amp;&amp; multimap

热门文章

  1. JAVA中各个包的主要作用
  2. [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
  3. [poj 2411]Mondriaan's Dream (状压dp)
  4. ZooKeeper概念
  5. Oracle学习总结(6)—— SQL注入技术
  6. 2015 Multi-University Training Contest 8 hdu 5385 The path
  7. File System Design Case Studies
  8. yii 表单小部件使用
  9. 面试宝典之基本的C#面试问答
  10. Linux程序设计学习笔记——异步信号处理机制