【CodeForces】576 B. Invariance of Tree
【题意】给定n个数的置换,要求使n个点连成1棵树,满足u,v有边当且仅当a[u],a[v]有边,求一种方案或无解。n<=10^5。
【算法】数学 置换
【题解】置换可以分解成若干循环,那么两个点的连边本质上是两个循环之间的连边。
因为要求无环(树),易知所有循环长度必须为偶数(这里不包括最后的情况1)。
那么循环之间通过连边形成一棵树后,最后的问题是必须至少存在一个循环内部相互连边。(不可能通过循环之间的连边使得循环内部连边,否则循环之间的连边就会构成环)
即,至少存在一个循环的长度为1或2才能实现,其它所有循环都向这个中心循环连边就可以满足要求。
那么,有以下结论:
1.存在长度为1的循环,其它循环向其连边,得解。
2.存在长度为2的循环,且不存在>1的奇数长度的循环,其它循环向其连边(交替),得解。
3.否则,无解。
例如,(4,2,1,3)=>(1,2) (3,2) (4,2) (6,5,4,3,1,2)=>(1,3) (6,4) (2,3) (5, 4)
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int n,a[maxn],b[maxn];
bool vis[maxn];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
int x=,y;
for(int i=;i<=n;i++)if(!vis[i]){
int j=i,len=,h=;
while(!vis[j]){
vis[j]=;
len++;
b[j]=h;
h=-h;
j=a[j];
}
if(len==)x=,y=i;else
if(len==&&x!=-&&x!=)x=,y=i;else
if(len%==&&x!=)x=-;
}
if(x<=){printf("NO");return ;}
if(x==){
printf("YES\n");
for(int i=;i<=n;i++)if(i!=y)printf("%d %d\n",i,y);
}
else{
printf("YES\n%d %d\n",y,a[y]);
for(int i=;i<=n;i++)if(i!=y&&i!=a[y])printf("%d %d\n",i,b[i]?y:a[y]);
}
return ;
}
【CodeForces】576 B. Invariance of Tree的更多相关文章
- 【CodeForces】576 D. Flights for Regular Customers
[题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...
- 【CodeForces】576 C. Points on Plane
[题目]C. Points on Plane [题意]给定坐标系中n个点的坐标(范围[0,10^6]),求一种 [ 连边形成链后总长度<=2.5*10^9 ] 的方案.n<=10^6. [ ...
- 【CodeForces】914 E. Palindromes in a Tree 点分治
[题目]E. Palindromes in a Tree [题意]给定一棵树,每个点都有一个a~t的字符,一条路径回文定义为路径上的字符存在一个排列构成回文串,求经过每个点的回文路径数.n<=2 ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
- 【BZOJ2843】极地旅行社(Link-Cut Tree)
[BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include< ...
- 【BZOJ4530】大融合(Link-Cut Tree)
[BZOJ4530]大融合(Link-Cut Tree) 题面 讨厌权限题!!! Loj链接 题目描述 小强要在 N个孤立的星球上建立起一套通信系统.这套通信系统就是连接 N个点的一个树.这个树的边是 ...
- 【BZOJ1969】航线规划(Link-Cut Tree)
[BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...
- 【BZOJ4825】【HNOI2017】单旋(Link-Cut Tree)
[BZOJ4825][HNOI2017]单旋(Link-Cut Tree) 题面 题面太长,懒得粘过来 题解 既然题目让你写Spaly 那就肯定不是正解 这道题目,让你求的是最大/最小值的深度 如果有 ...
- 【BZOJ3669】【Noi2014】魔法森林(Link-Cut Tree)
[BZOJ3669][Noi2014]魔法森林(Link-Cut Tree) 题面 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n ...
随机推荐
- 微信小程序组件 自定义单选
<view class='userperson'> <view class='f30 flexca'>请选择您的注册身份</view> <view class ...
- ASP.NET前后端分离框架
- delphi使用SQL的教程4(使用Params属性为参数赋值 )
17.4.1 使用Params属性为参数赋值 TQuery部件具有一个Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为TQuery部件编写动态SQL 语句时, D ...
- android面试(1)----布局
1.说出android 五中布局,并说出各自作用? FrameLayout: 堆叠布局,也是就可以堆在一起.最长应用于Fragment的使用上. LinearLayout: 线性布局,可以是竖排或水平 ...
- LR安装No Background bmp defined in section General entry BGBmp的解决办法
问题描述:我在win10装LR11总是报这个错误:No Background bmp defined in section "General" entry "BGBmp& ...
- 降雨量 HYSBZ - 1067(RMQ)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ Login Register 捐赠本站 Notice:1:注册本OJ方式请见ht ...
- UVA - 11997(巧妙的优先队列)
题意: 有k个整数数组,各包含k个元素,在每个数组中取一个元素加起来,可以得到kk个和,求这些和中最小的k个值 解析: 从简单的情况开始分析:经典方法,对原题没有思路,那么分析问题的简化版 这是对于两 ...
- 如何实现密码输入框focus状态弹出提示信息
一.密码输入提示框样式实现 效果图如下: 源码如下: <html> <style type="text/css"> *{ padding: 0; margi ...
- elasticsearch 第一篇(入门篇)
介绍 elasticsearch是一个高效的.可扩展的全文搜索引擎 基本概念 Near Realtime(NRT): es是一个接近实时查询平台,意味从存储一条数据到可以索引到数据时差很小,通常在1s ...
- window上安装elasticserach
提供一个百度云链接下载elasticsearch (链接:https://pan.baidu.com/s/1sk8PYjV 密码:l586) 测试达到目的:安装elasticsearch后再安装hea ...