题目链接

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. 遗传算法与Java代码简单实现

    参阅地址: https://www.jianshu.com/p/ae5157c26af9 代码实现: public class GA { private int ChrNum = 10; //染色体数 ...

  2. 安装jenkins时出现 No such plugin: cloudbees-folder的解决办法

    今天安装了一下jenkins,在初始化安装插件时出现" No such plugin: cloudbees-folder"错误,根据网上的教程: 1.打开链接"http: ...

  3. js变量声明提升

    1.变量提升 根据javascript的运行机制和javascript没有块级作用域这个特点,可以得出,变量会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的. 变量声明提升至全局 ...

  4. visual studio2015 搭建pro*c开发编译环境

    关于pro*c是什么,这里不做介绍,主要说明如何在vs2015里面开发pro*c程序,并编译exe执行文件 一.vs2015环境配置 1.新建一个空的vc++项目,如下图 2.右击项目属性,添加相关的 ...

  5. 修改this的指向

    call var a={ name:'xuux', fn:function(a,b){ console.log(a+b); console.log(this);//{name: "xuux& ...

  6. 6 java 笔记

    1 java的类通过构造器来创建该类的对象 2 java提供extends关键字来实现子类继承父类 3 初始化块总是在构造器调用之前被执行 4 可以吧java中的类当成一种自定义的类型 5 类定义的变 ...

  7. Repeater循环页面上的控件

    List<string> list = new List<string>(); for (int k = 0; k < RepeaterList.Items.Count; ...

  8. Qt5配置winpCap

    在网上查了很多资料,搞了差不多一天总算解决Qt5使用winPcap配置的问题了!记录一下 以便后续忘记 1.下载winpcap4.1.3,百度即可搜索到 2.下载winpCap开发者工具包http:/ ...

  9. win10编译maskrcnn benchmark

    步骤 1. 按照官网的Option1安装步骤安装 https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/INSTALL. ...

  10. ubuntu16.04下NVIDIA GTX965M显卡驱动PPA安装

    禁用nouveau驱动 Ubuntu系统集成的显卡驱动程序是nouveau,我们需要先将nouveau从linux内核卸载掉才能安装NVIDIA官方驱动.将nouveau添加到黑名单blacklist ...