题目链接

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 面向对象的设计原则

    一. 1.面向对象思想的核心: 封装.继承.多态.   2.面向对象编程的追求: 高内聚低耦合的解决方案: 代码的模块化设计: 3.什么是设计模式: 针对反复出现的问题的经典解决方案,是对特定条件下( ...

  2. Java 封装与类

    一.面向对象编程 面向对象编程三大特性:封装.继承和多态. 类是实现封装的手段,是面向对象编程的基本单元. 封装隐藏了类的内部实现细节,暴露给外界可控的操作,提高数据的完整性和安全性,提高模块的可重用 ...

  3. asp.net 6.aspx页面

    1.aspx页面的头部 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Us ...

  4. Js 参数乱码

    在前台,对URL的中文参数执行两次encodeURI:  序列化 var param = encodeURI(encodeURI("中文")); 反序列化 decodeURI($. ...

  5. 搭建自己的框架WedeNet(四)

    WedeNet2018.Web-UI层:结构如下: 首先,在Controller中定义BaseController,以便加入统一处理逻辑,如下: using log4net; using System ...

  6. springcloud(十二)-springcloud-config统一管理微服务配置

    1.为什么要统一管理微服务配置 对于传统的单体应用,常使用配置文件管理所有配置.例如一个SpringBoot开发的单体应用,可将配置内容放在application.yml文件中.如果需要切换环境,可设 ...

  7. jeesite直接登录——真实破解

    前台 后台 @RequiresPermissions("alarm:alarm:view")一定要注释 —————————————————————————————————————— ...

  8. shell脚本中的EOF以及文件重定向

    <<EOF  (内容)  EOF  可以把EOF替换成其他东西(分解符)  意思是把内容当作标准输入传给程序 这里再简要回顾一下<<的用法.当Shell看到<<的时 ...

  9. 8、nginx基础

    1Nginx基本简述 Nginx是一个开源且高性能.可靠的Http Web服务.代理服务. 开源: 直接获取源代码 高性能: 支持海量并发 可靠: 服务稳定 我们为什么选择 Nginx服务 Nginx ...

  10. tomcat8.5打开manager页面报错的问题

    之前用的8.0版本的tomcat,最近需要将版本升级,当前8的最新的版本是8.5.42,升级之后发现manager页面打不开了,就是下面这个按钮的页面 点击之后报403没权的错误 还是按照8.0版本的 ...