[BZOJ2791][Poi2012]Rendezvous
2791: [Poi2012]Rendezvous
Time Limit: 25 Sec Memory Limit: 128 MB
Submit: 95 Solved: 71
[Submit][Status][Discuss]
Description
给定一个n个顶点的有向图,每个顶点有且仅有一条出边。
对于顶点i,记它的出边为(i, a[i])。
再给出q组询问,每组询问由两个顶点a、b组成,要求输出满足下面条件的x、y:
1. 从顶点a沿着出边走x步和从顶点b沿着出边走y步后到达的顶点相同。
2. 在满足条件1的情况下max(x,y)最小。
3. 在满足条件1和2的情况下min(x,y)最小。
4. 在满足条件1、2和3的情况下x>=y。
如果不存在满足条件1的x、y,输出-1 -1。
Input
第一行两个正整数n和q (n,q<=500,000)。
第二行n个正整数a[1],a[2],...,a[n] (a[i]<=n)。
下面q行,每行两个正整数a,b (a,b<=n),表示一组询问。
Output
输出q行,每行两个整数。
Sample Input
4 3 5 5 1 1 12 12 9 9 7 1
7 2
8 11
1 2
9 10
10 5
Sample Output
1 2
2 2
0 1
-1 -1
HINT
Source
n个点,n条边且每个点都有出边,显然是环套树森林。
先dfs把环套树拆成一堆树,倍增LCA。
先将x,y两个点倍增到环上,然后判断即可。
#include<cstdio>
#include<algorithm>
#define N 500050
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,fa[N][],root,q,circle[N],deep[N];
int num[N],sum[N],tot,pos[N],vis[N];
void findcircle(int x)
{
int now=x;
for(;;x=fa[x][])
{
if(vis[x]==now)break;
if(vis[x])return;
vis[x]=now;
}
tot++;
while(!circle[x])
{
circle[x]=x;
deep[x]=;
num[x]=++sum[tot];
pos[x]=tot;
x=fa[x][];
}
}
void dfs(int x)
{
if(deep[x])return;
dfs(fa[x][]);
circle[x]=circle[fa[x][]];
deep[x]=deep[fa[x][]]+;
for(int i=;(<<i)<deep[x];i++)
fa[x][i]=fa[fa[x][i-]][i-];
}
inline int lca(int x,int y)
{
if(deep[x]<deep[y])swap(x,y);
int t=deep[x]-deep[y];
for(int i=;~i;i--)
if(t&(<<i))x=fa[x][i];
if(x==y)return x;
for(int i=;~i;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][];
}
bool judge(int a,int b,int c,int d)
{
if(max(a,b)<max(c,d))return ;
if(max(a,b)>max(c,d))return ;
if(min(a,b)<min(c,d))return ;
if(min(a,b)>min(c,d))return ;
if(a>=b)return ;
return ;
}
int main()
{
n=read();q=read();
for(int i=;i<=n;i++)
fa[i][]=read();
for(int i=;i<=n;i++)
findcircle(i);
for(int i=;i<=n;i++)
if(!circle[i])dfs(i);
while(q--)
{
int x=read(),y=read();
if(pos[circle[x]]!=pos[circle[y]])
{
puts("-1 -1");
continue;
}
if(circle[x]==circle[y])
{
int t=lca(x,y);
printf("%d %d\n",deep[x]-deep[t],deep[y]-deep[t]);
continue;
}
int ans1=deep[x]-,ans2=deep[y]-,t=pos[circle[x]];
x=num[circle[x]];y=num[circle[y]];
int z1=(sum[t]+y-x)%sum[t],z2=sum[t]-z1;
if(judge(ans1+z1,ans2,ans1,ans2+z2))
printf("%d %d\n",ans1+z1,ans2);
else printf("%d %d\n",ans1,ans2+z2);
}
}
[BZOJ2791][Poi2012]Rendezvous的更多相关文章
- [BZOJ2791]:[Poi2012]Rendezvous(塔尖+倍增LCA)
题目传送门 题目描述 给定一个有n个顶点的有向图,每个顶点有且仅有一条出边.每次询问给出两个顶点${a}_{i}$和${b}_{i}$,求满足以下条件的${x}_{i}$和${y}_{i}$: ...
- 【BZOJ2791】[Poi2012]Rendezvous 倍增
[BZOJ2791][Poi2012]Rendezvous Description 给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组 ...
- 【BZOJ 2791】 2791: [Poi2012]Rendezvous (环套树、树链剖分LCA)
2791: [Poi2012]Rendezvous Description 给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两 ...
- bzoj 2791 [Poi2012]Rendezvous 基环森林
题目大意 给定一个n个顶点的有向图,每个顶点有且仅有一条出边. 对于顶点i,记它的出边为(i, a[i]). 再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y: 从顶点a沿着 ...
- [Poi2012]Rendezvous
题目描述 给定一个n个顶点的有向图,每个顶点有且仅有一条出边. 对于顶点i,记它的出边为(i, a[i]). 再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y: 从顶点a沿着 ...
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- LG3533 [POI2012]RAN-Rendezvous
2791: [Poi2012]Rendezvous Time Limit: 25 Sec Memory Limit: 128 MBSubmit: 259 Solved: 160[Submit][S ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 「POI2012」约会 Rendezvous
#2691. 「POI2012」约会 Rendezvous 这题我简直不想说什么了,什么素质,卡常数…… “每个顶点有且仅有一条出边”,所以是一道基环树的题,首先tarjan缩点,在缩完点后的图上求a ...
随机推荐
- Android系统中默认值的意义列表
转自:http://blog.csdn.net/yabg_zhi_xiang/article/details/51727844 在SettingsProvider中设置系统中默认值,我们可以在fram ...
- 【翻译十一】java-原子性操作
Atomic Access In programming, an atomic action is one that effectively happens all at once. An atomi ...
- 如何减少JS的全局变量污染
A,唯一变量 B,闭包
- 【openGL】画直线
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...
- IBM Rational AppScan 无法记录登录序列 分类: 数据安全 2015-03-18 16:46 158人阅读 评论(0) 收藏
为了测试漏洞,我在本地部署了一个站点,为http://localhost/app,并且有登录页面. 但是尝试多次,都无法记录登录页面.此时尝试了在hosts文件中,自定义了一个域名 127.0.0.1 ...
- less 入门1
less 入门1 less.html <!DOCTYPE html> <html lang="zh-cn"> <head > <meta ...
- 【转】从RGB色转为灰度色算法
----本文摘自作者ZYL910的博客 一.基础 对于彩色转灰度,有一个很著名的心理学公式: Gray = R*0.299 + G*0.587 + B*0.114 二.整数算法 而实际应用时,希望避 ...
- 主流IM协议简介
四种主流的IM协议, XMPP协议.即时信息和空间协议(IMPP).空间和即时信息协议(PRIM).针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE). XMPP协议: 在这四种协议中,X ...
- Redis主从自动failover
Redis主从架构持久化存在一个问题,即前次测试的结论,持久化需要配置在主实例上才能跨越实例保证数据不丢失,这样以来主实例在持久化数据到硬 盘的过程中,势必会造成磁盘的I/O等待,经过实际测试,这个持 ...
- java的几种对象(PO,VO,DAO,BO,POJO)解释
java的几种对象(PO,VO,DAO,BO,POJO)解释 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...