题目链接

https://atcoder.jp/contests/agc005/tasks/agc005_e

题解

完了真的啥都不会了……

首先,显然如果某条A树的边对应B树上的距离大于等于\(3\), 且A能走到该边的某个端点,那么答案就是\(-1\).

A能走到某个点当且仅当从A的起点到这个点的路径上每个点与A起点的距离都小于与B起点的距离。

然后直接在A树上从根开始DFS,如果走不到了就返回,否则用与\(y\)的距离更新答案;同时在遍历每条边的时候判断是否可以\(-1\).

时间复杂度\(O(n\log n)\), 但是由于距离不超过\(3\)的特殊性可以优化成\(O(n)\).

上面的性质我都发现了,可是我做不出来这题……到底是什么情况……

代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cassert>
using namespace std; const int N = 2e5;
const int lgN = 18;
const int INF = 1e7;
struct Edge
{
int v,nxt;
} e1[(N<<1)+3],e2[(N<<1)+3];
int fe1[N+3],fe2[N+3];
int dep1[N+3],dep2[N+3];
int fa2[N+3][lgN+3];
int n,en1,en2,s1,s2,ans; void addedge1(int u,int v)
{
en1++; e1[en1].v = v;
e1[en1].nxt = fe1[u]; fe1[u] = en1;
}
void addedge2(int u,int v)
{
en2++; e2[en2].v = v;
e2[en2].nxt = fe2[u]; fe2[u] = en2;
} void dfs1(int u,int prv)
{
for(int i=fe1[u]; i; i=e1[i].nxt)
{
int v = e1[i].v;
if(v==prv) continue;
dep1[v] = dep1[u]+1;
dfs1(v,u);
}
} void dfs2(int u)
{
for(int i=1; i<=lgN; i++) fa2[u][i] = fa2[fa2[u][i-1]][i-1];
for(int i=fe2[u]; i; i=e2[i].nxt)
{
int v = e2[i].v;
if(v==fa2[u][0]) continue;
fa2[v][0] = u; dep2[v] = dep2[u]+1;
dfs2(v);
}
} int LCA(int u,int v)
{
if(dep2[u]<dep2[v]) swap(u,v);
int dif = dep2[u]-dep2[v];
for(int i=0; i<=lgN; i++)
{
if(dif&(1<<i)) {u = fa2[u][i];}
}
if(u==v) return u;
for(int i=lgN; i>=0; i--)
{
if(fa2[u][i]!=fa2[v][i]) {u = fa2[u][i],v = fa2[v][i];}
}
return fa2[u][0];
} void dfs(int u,int fa)
{
if(dep1[u]>=dep2[u]) {return;}
ans = max(ans,dep2[u]);
for(int i=fe1[u]; i; i=e1[i].nxt)
{
int v = e1[i].v;
if(v==fa) continue;
if(dep2[u]+dep2[v]-2*dep2[LCA(u,v)]>2) {ans = INF; return;}
dfs(v,u);
}
} int main()
{
scanf("%d%d%d",&n,&s1,&s2);
for(int i=1; i<n; i++)
{
int u,v; scanf("%d%d",&u,&v);
addedge1(u,v); addedge1(v,u);
}
for(int i=1; i<n; i++)
{
int u,v; scanf("%d%d",&u,&v);
addedge2(u,v); addedge2(v,u);
}
dfs1(s1,0); dfs2(s2);
ans = 0; dfs(s1,0);
printf("%d\n",ans==INF?-1:ans*2);
return 0;
}

AtCoder AGC005E Sugigma: The Showdown (博弈论)的更多相关文章

  1. Atcoder Grand Contest 005 E - Sugigma: The Showdown(思维题)

    洛谷题面传送门 & Atcoder 题面传送门 记先手移动棋子的树为红树,后手移动棋子的树为蓝树. 首先考虑一个性质,就是如果与当前红色棋子所在的点相连的边中存在一条边,满足这条边的两个端点在 ...

  2. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  3. AtCoder Grand Contest 005

    AtCoder Grand Contest 005 A - STring 翻译 给定一个只包含\(ST\)的字符串,如果出现了连续的\(ST\),就把他删去,然后所有位置前移.问最后剩下的串长. 题解 ...

  4. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

  5. Atcoder/Topcoder 口胡记录

    Atcoder/Topcoder 理论 AC Atcoder的❌游戏示范 兴致勃勃地打开一场 AGC 看 A 题,先 WA 一发,然后花了一年时间 Fix. 看 B 题,啥玩意?这能求? 睡觉觉. e ...

  6. 【AtCoder】AGC005

    AGC005 A - STring 用一个栈,如果遇到S就弹入,如果遇到T栈里有S就弹出栈顶,否则T在最后的串里,最后计算出的T和栈里剩的S就是答案 #include <bits/stdc++. ...

  7. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  8. A@G!C005

    AGC005 A STring 不会,有没有老鸽蕉蕉我/kk/kel/dk https://agc005.contest.atcoder.jp/submissions/7926986 B Minimu ...

  9. AtCoder AGC002E Candy Piles (博弈论)

    神仙题..表示自己智商不够想不到... 好几次读成最后拿的赢了,导致一直没看懂题解... 题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_e ...

随机推荐

  1. js判断是否是对象获取子窗体值

    判断是否是对象 Object.prototype.toString.call(obj) 装换为数组 Array.prototype.slice.call(obj) 父窗体获取值子窗体值$(functi ...

  2. windows服务总结

    一.创建windows服务项目创建完成后结构,如: 其中,Program.cs代码: using System; using System.Collections.Generic; using Sys ...

  3. 关于spring中bean配置的几件小事

    一.IOC和DI 1.IOC(Inversion of Control) 其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源:而应用了IOC之后 ...

  4. 几种常用的java 实现反转的方法———reverse

    1.最简单的方法 public static String reverse1(String str) return new StringBuffer(str).reverse().toString() ...

  5. ubuntu18.04安装fcitx

    fcitx安装比较麻烦,我每次安装都要费不少劲,每次装安之后都没有写日志记录下来,导致下次装的时候又手忙脚乱,所以这次一定要记录下来. 前因: 我本来用的是ibus,但是这个输入法好像有bug,我在编 ...

  6. django概念理解

    STATIC_URL 和 STATICFILES_DIRS 区别  static_url指定浏览器上访问静态文件的url前缀,也就是'/static/'前缀的都会认为是静态文件,django不解析,直 ...

  7. Mysql(四)-2:多表查询

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...

  8. Makefile 编译静态库文件及链接静态库

    本文为原创文章,转载需指明该文链接 1.代码目录结构如下: comm/ comm/inc/apue.h  3 atexit.c Makefile  5 staticlib/lib/ staticlib ...

  9. 4.Nginx配置文件Nginx.conf_虚拟主机配置规则

    1.Nginx配置文件及各个配置项含义 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全 ...

  10. opencv,用摄像头识别贴片元件的定位和元件的角度(转载)

    经过半个月学习opencv有点小成果,用摄像头识别贴片元件的定位和元件的角度(转载) (2013-04-17 16:00:22) 转载▼   分类: 学习笔记 先说一下开源的opencv真是一件伟大的 ...