【BZOJ2791】[Poi2012]Rendezvous 倍增

【BZOJ2791】[Poi2012]Rendezvous

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

12 5
4 3 5 5 1 1 12 12 9 9 7 1
7 2
8 11
1 2
9 10
10 5

Sample Output

2 3
1 2
2 2
0 1
-1 -1

题解:由于给出的是个基环树森林,所以我们考虑如下几种情况。

1.最终不会走到一个环上,-1。
2.还没走到环上就相遇,那么我们用倍增,当成树上LCA来处理即可。
3.走到环上才相遇,那么相遇点一定是两人刚走到环上时的两个点中的一个,判一下即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int maxn=500010;
int n,m,sum,cnt;
int r[20][maxn],to[maxn],next[maxn],head[maxn],Log[maxn],bel[maxn],pos[maxn],len[maxn],toc[maxn],d[maxn];
queue<int> q;
vector<int> v[maxn];
inline void add(int a,int b)
{to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
inline int lca(int a,int b)
{if(d[a]<d[b])	swap(a,b);for(int i=Log[d[a]-d[b]];i>=0;i--)	if(d[r[i][a]]>=d[b])	a=r[i][a];if(a==b)	return a;for(int i=Log[d[a]];i>=0;i--)	if(r[i][a]!=r[i][b])	a=r[i][a],b=r[i][b];return r[0][a];
}
inline bool cmp(int x1,int y1,int x2,int y2)
{if(max(x1,y1)!=max(x2,y2))	return max(x1,y1)<max(x2,y2);if(min(x1,y1)!=min(x2,y2))	return min(x1,y1)<min(x2,y2);return x1>=y1;
}
inline int rd()
{int ret=0,f=1;	char gc=getchar();while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}while(gc>='0'&&gc<='9')	ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd();memset(head,-1,sizeof(head));int i,j,u,a,b,x,y,x1,y1,x2,y2;for(i=1;i<=n;i++)	r[0][i]=rd(),d[r[0][i]]++;for(i=2;i<=n;i++)	Log[i]=Log[i>>1]+1;for(j=1;(1<<j)<=n;j++)	for(i=1;i<=n;i++)	r[j][i]=r[j-1][r[j-1][i]];for(i=1;i<=n;i++)	if(!d[i])	q.push(i);while(!q.empty()){u=q.front(),q.pop();d[r[0][u]]--;if(!d[r[0][u]])	q.push(r[0][u]);}for(i=1;i<=n;i++)	if(d[i]&&!bel[i])for(sum++,j=i;!bel[j];j=r[0][j])	pos[j]=++len[sum],bel[j]=sum;for(i=1;i<=n;i++){if(bel[i])	d[i]=0,toc[i]=i,q.push(i);else	add(r[0][i],i);}while(!q.empty()){u=q.front(),q.pop();for(i=head[u];i!=-1;i=next[i])	d[to[i]]=d[u]+1,toc[to[i]]=toc[u],q.push(to[i]);}for(i=1;i<=m;i++){a=rd(),b=rd();if(bel[toc[a]]!=bel[toc[b]])	printf("-1 -1\n");else	if(toc[a]==toc[b]){x=lca(a,b);printf("%d %d\n",d[a]-d[x],d[b]-d[x]);}else{x=d[a],a=toc[a],y=d[b],b=toc[b];x1=x+(pos[b]-pos[a]+len[bel[a]])%len[bel[a]],y1=y;x2=x,y2=y+(pos[a]-pos[b]+len[bel[b]])%len[bel[b]];if(cmp(x1,y1,x2,y2))	printf("%d %d\n",x1,y1);else	printf("%d %d\n",x2,y2);}}return 0;
}//12 5 4 3 5 5 1 1 12 12 9 9 7 1 7 2 8 11 1 2 9 10 10 5 

转载于:https://www.cnblogs.com/CQzhangyu/p/7814389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

app开发人脸登录和指纹登录_易讯云通讯推出“一键登录”,为App登录提供新方案...

移动互联网时代&#xff0c;用户的耐心越来越少&#xff0c;注意力也越来越弱&#xff0c;追求便捷与高效。登录的方式从自定义的账号密码登录&#xff0c;到邮箱登录&#xff0c;到第三方登录与手机验证码登录两种登录方式进行竞争&#xff0c;到现在的个人指纹&#xff0c;人…

1641B. Repetitions Decoding

B. Repetitions Decoding 一个写起来繁琐一点的构造&#xff0c;主要是要记录到哪了。#include<bits/stdc.h> using namespace std; const int N1e6; int t,n,a[N],p[N],v,l,r,A[N],B[N],c,q[N],s; void T(int x,int y) {A[c]x,B[c]y;//A存储地方&#xff0c;B存储数值f…

可以直接考甲级吗_成人高考可以考本科吗?成人高考可以考研究生吗?

成人高考可以考本科吗?成人高考可以考研究生吗?当你选择利用成人高考的方式来提升学历的时候&#xff0c;那么我们需要了解关于成人高考的知识越多越好。成人高考可以考本科吗?成人高考可以考研究生吗?相信这是很多考生都想要了解的问题。成人高考可以考本科吗?成人高考可…

python变量和字符串

这段时间忘记更博了&#xff0c;学的太投入就一口气把python都学完&#xff0c;做了几个上手的小项目&#xff0c;自娱自乐&#xff0c;把笔记都写在百度云笔记中&#xff0c;现在就开始把所有笔记都粘贴复制分享给大家把 变量变量就是编程最基本的存储单位比如a12&#xff0c;…

1634C. OKEA

C. OKEA 一道简单的数学问题&#xff0c;一行只能有奇数或者偶数&#xff0c;进行判断就行了#include<bits/stdc.h> using namespace std; const int N1e6; int main() {int t,n,k;cin>>t;while (t--&&cin>>n>>k){int cnt (n*k1)/2;//奇数的…

php面试编程题_PHP程序员面试题(经典汇总,mysql为主)

以下是本节php面试题的全部内容。1.表单中 get与post提交方法的区别?答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.2.session与cookie的区别?答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(sess…

js中 style.width与 offsetWidth的区别

作为一个初学者&#xff0c;经常会遇到在获取某一元素的宽度&#xff08;高度、top值...&#xff09;时&#xff0c;到底是用 style.width还是offsetWidth的疑惑。 1. 当样式写在行内的时候&#xff0c;如 <div id"box" style"width:100px">时&#…

1634D. Finding Zero

D. Finding Zero 构造&#xff0c;我们设a&#xff0c;b&#xff0c;c里面有最大值和最小值在这里插入代码片&#xff0c;然后再从中找到二者 #include<bits/stdc.h> using namespace std; const int N 2e67; int ask(int a,int b,int x) {cout<<"? "…

Python中曲率与弯曲的转换_黎曼几何学习笔记(3)——共形数量曲率与高斯曲率...

参考文献&#xff1a;(GTM171)Peter《Riemannian Geometry》&#xff0c;Richard Mikula《Notes on the Yamabe Flow》&#xff0c;夏青《曲面上的预定高斯曲率问题》.我声明以下内容我亲自验算过&#xff0c;在文章后面我会给出我的部分验算手稿.设是维紧致可定向黎曼流形&…

Nginx服务基础

Nginx的英文官方网站是http://nginx.org&#xff0c;在这里可以查看Nginx的各个软件版本信息。Nginx软件有三种版本&#xff1a;稳定版、开发版和历史稳定版。开发版更新较快&#xff0c;包含最新的功能和bug的修复&#xff0c;但同时也可能会遇到新的bug&#xff0c;开发版的更…

1622C. Set or Decrease

C. Set or Decrease 一道思维题#include <bits/stdc.h> using namespace std; #define int long long const int N 2e57; int a[N]; signed main() {int t;cin>>t;while (t--){int n,k,sum 0;cin>>n>>k;for (int i0;i<n;i){cin>>a[i];suma…

Linux下搭建iSCSI共享存储详细步骤(服务器模拟IPSAN存储)

一、简介 iSCSI&#xff08;internet SCSI&#xff09;技术由IBM公司研究开发&#xff0c;是一个供硬件设备使用的、可以在IP协议的上层运行的SCSI指令集&#xff0c;这种指令集合可以实现在IP网络上运行SCSI协议&#xff0c;使其能够在诸如高速千兆以太网上进行路由选择。iSCS…

yum如何安装特定版本的gcc_linux下如何升级python

Python 的概念小编使用的centos7下的python版本为2.7,而python要全面转向python3,故升级pyhton迫在眉睫&#xff0c;今天来介绍一下如何升级centos下的python首先要确定需要升级的python3的版本&#xff0c;比如小编想升级到3.7.0&#xff0c;在linux下输入命令&#xff1a;这条…

java报错空指针异常_夯实基础:认识一下这10 个深恶痛绝的 Java 异常

异常是 Java 程序中经常遇到的问题&#xff0c;我想每一个 Java 程序员都讨厌异常&#xff0c;一 个异常就是一个 BUG&#xff0c;就要花很多时间来定位异常问题。什么是异常及异常的分类请看这篇文章&#xff1a;异常小结&#xff1a;上一张图搞清楚Java的异常机制。今天来列一…

页面分页

需求&#xff1a;当数据很多&#xff0c;一个页面难以展现时&#xff0c;便需要分页来实现。 说在前面&#xff1a; 1.每一页展示的数据可以从数据库中抽取出来&#xff0c;数据查询方法中有limit这个方法&#xff0c;limit x,y —–>x表示从第几条数据开始查询&#xff0c;…

Codeforces Round #789 (Div. 2)(A-D)

Codeforces Round #789 (Div. 2) A. Tokitsukaze and All Zero Sequence 一个小小的思维贪心&#xff0c;很容易知道如果有0&#xff0c;直接用0去和其他数处理&#xff0c;如果没有就先创造一个 #include <bits/stdc.h> using namespace std; #define int long long c…

typora打开pdf文件提示文件过大_Win7/Win10拷贝到U盘容量足够却提示文件过大的解决方法...

前段时间&#xff0c;装机之家分享了系统安装的教程&#xff0c;不过有用户在拷贝系统镜像文件的时候&#xff0c;出现了系统提示文件过大&#xff0c;但是U盘容量足够大&#xff0c;这是什么情况呢&#xff1f;下面装机之家分享的Win7/Win10系统下拷贝到U盘容量足够却提示文件…

图像卷积与滤波的一些知识点

http://blog.csdn.net/zouxy09/article/details/49080029 之前在学习CNN的时候&#xff0c;有对卷积进行一些学习和整理&#xff0c;后来就烂尾了&#xff0c;现在稍微整理下&#xff0c;先放上来&#xff0c;以提醒和交流。 一、线性滤波与卷积的基本概念 线性滤波可以说是图像…

数据库(1)基础知识

mysql的登录登出 : 方法一&#xff1a;通过MySQL再带的客户端&#xff08;只限于root用户&#xff09; 方法二&#xff1a;通过windows自带的客户端 登录&#xff1a;MySQL【-h主机名 -p端口号】-u用户名 -p密码 退出&#xff1a;exit或者ctrlc mysql的常见命令&#xff1a; 1…

1到10选一个数字读心术_厉害了!quot;广东110“互联网报警满足您多场景报警需求!...

01报警人哎&#xff0c;110&#xff0c;这边打架了。(南方口音)警察在哪里?报警人在fa ben 市场门口嘛。警察什么“发奔”市场&#xff0c;没听过这个地方&#xff0c;你能讲清楚点吗?报警人就是那个卖“发发”草草的市场嘛&#xff0c;哎&#xff0c;这都不知道&#xff0c;…