Codeforces Round #319 (Div. 2) D - Invariance of Tree
题目大意:给你一个有1-n组成的序列p,让你构造一棵树,如果节点a和b之间有一条边,则p[a]和p[b]之间也有一条边。
思路:没啥思路,看了题解菜爆。
我们可以把1-n个数分到若干个集合里边,一个集合里边的元素要满足按顺序转移改变的性质,如果有其中一个集合的元素等于数量等于1
或者其中一个集合的元素数量等于二,并且没有集合有奇数个元素。 因为我们需要用一个集合当作树的基准来构造,将其他集合的元素
连到这个基准上,所以如果这个基准的元素大于三个他们之间必然成环,并且如果其他集合有奇数个元素,那么循环一圈后肯定会产生矛盾。
还有要注意的一点是,一个集合不一定是一个圈,可能有一段出来的尾巴,那我们先从没有入度的点开始dfs就行了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int base[],p[N],vis[N],n;
bool in[N];
vector<int>ans;
bool dfs(int cur,int step)
{
vis[cur]=step;
ans.push_back(cur);
if(!vis[p[cur]]) return dfs(p[cur],step+);
int t=step+-vis[p[cur]];
return base[]==base[] || t== || t%==;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&p[i]);
in[p[i]]=;
if(i==p[i]) base[]=base[]=i;
}
if(base[]==)
{
for(int i=;i<=n;i++)
{
if(i==p[p[i]])
{
base[]=i;
base[]=p[i];
break;
}
}
}
if(base[]==) puts("NO");
else
{
vis[base[]]=vis[base[]]=;
for(int i=;i<=n;i++)
{
if(!in[i])
{
if(!dfs(i,))
{
puts("NO");
return ;
}
}
}
for(int i=;i<=n;i++)
{
if(!vis[i])
{
if(!dfs(i,))
{
puts("NO");
return ;
}
}
}
puts("YES");
if(base[]!=base[]) printf("%d %d\n",base[],base[]);
int len=ans.size();
for(int i=;i<len;i++) printf("%d %d\n",base[i&],ans[i]);
puts("");
}
}
Codeforces Round #319 (Div. 2) D - Invariance of Tree的更多相关文章
- Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
B. Invariance of Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/ ...
- Codeforces Round 319 # div.1 & 2 解题报告
Div. 2 Multiplication Table (577A) 题意: 给定n行n列的方阵,第i行第j列的数就是i*j,问有多少个格子上的数恰为x. 1<=n<=10^5, 1< ...
- Codeforces Round #319 (Div. 1) C. Points on Plane 分块
C. Points on Plane Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/pro ...
- Codeforces Codeforces Round #319 (Div. 2) C. Vasya and Petya's Game 数学
C. Vasya and Petya's Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/ ...
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...
- Codeforces Codeforces Round #319 (Div. 2) A. Multiplication Table 水题
A. Multiplication Table Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/57 ...
- 构造+分块思想 Codeforces Round #319 (Div. 1) C
http://codeforces.com/contest/576/problem/C 题目大意: 给你一个曼哈顿距离的图,然后要求你找到一个链,链穿了所有的点 然后要求这链的长度<=25*10 ...
- Codeforces Round #319 (Div. 2) E - Points on Plane
题目大意:在一个平面里有n个点,点坐标的值在1-1e6之间,让你给出一个遍历所有点的顺序,要求每个点走一次,且 曼哈顿距离之和小于25*1e8. 思路:想了一会就有了思路,我们可以把1e6的x,y坐标 ...
- Codeforces Round #319 (Div. 2) D
E A tree of size n is an undirected connected graph consisting of n vertices without cycles. Conside ...
随机推荐
- Redis详解(一)冰叔带你了解Redis
Redis 是一种基于 键值对 的 NoSQL 数据库.与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串).hash(哈希).list(列表).set ...
- ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)
题目链接: https://nanti.jisuanke.com/t/31001 超时代码: #include<bits/stdc++.h> using namespace std; # ...
- mysql 架构 ~ PXC5.7.20安装尝试
简介:今天来尝试下 pxc 5.7.20安装1 环境安装 yum install -y git scons gcc gcc-c++ openssl check cmake bison boost- ...
- Theano教程:Python的内存管理
在写大型程序时候的一大挑战是如何保证最少的内存使用率.但是在Python中的内存管理是比较简单的.Python显示分配内存,使用引用计数系统管理对象,当指向某一个对象的引用数变为 0 的时候,该对象所 ...
- 【shell】查找后拷贝find . -name *.csv -exec cp {} /home/ \;
Find命令的一般形式为: find pathname -options [-print -exec -ok] 让我们来看看该命令的参数: pathname: find命令所查找的目录路径.例如用.来 ...
- T_RegionNDS表创建及值
-- Table structure for t_regionnds -- ---------------------------- DROP TABLE IF EXISTS t_regionnds; ...
- Linux系统无线网卡的安装【转】
转自:http://www.linuxidc.com/Linux/2013-03/81473.htm 现在的很多的可移动无线网卡都是usb接口的,把这种网卡应用到windows操作系统上是很容易就能起 ...
- jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法
一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. 在本文中我们将学习这些新特性,并用实际 ...
- springboot系列九,springboot整合邮件服务、整合定时任务调度
一.整合邮件服务 如果要进行邮件的整合处理,那么你一定需要有一个邮件服务器,实际上 java 本身提供有一套 JavaMail 组件以实现邮件服务器的搭建,但是这个搭建的服务器意义不大,因为你现在搭建 ...
- NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{HBmUtjMOQP2pgLFFwqa_Og}{172.16.0.163}{172.16.0.163:9300}] ]
1.找到elasticsearch的安装目录,在config目录找到elasticsearch.yml,查看cluster.name的赋值 2.在SpringBoot的yml文件中,不仅要配置clus ...