这道题算不算脑洞题。。

可以发现,当一个排列中有循环节时长度为1或2时可能有解。当为1时,只需把全部点都连到这个题即可,当为2时,就要求所有循环节长度均为偶数,这很容易理解,因为如果存在为奇数,它们之间连线之后就可以形成环或者不存在的情况了。把其他循环节上的点分别连到这两个点上即可。为什么是2呢?因为,可以理解为树上的一条连连T_T

666666

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>using namespace std;int permutations[100005];
bool vis[100005];
vector<int>ans;int main(){int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++){scanf("%d",&permutations[i]);memset(vis,false,sizeof(vis));}bool one_exist=false;bool two_exist=false;int two_pos=-1;int ans_one=-1;ans.clear();for(int i=1;i<=n;i++){if(!vis[i]){int cc=1;vis[i]=true;int ni=i;while(!vis[permutations[ni]]){ni=permutations[ni];vis[ni]=true;cc++;}if(cc==1){one_exist=true;ans_one=i;break;}if(cc==2){two_exist=true;two_pos=i;}ans.push_back(cc);}}int sz=ans.size();if(one_exist){puts("YES");for(int i=1;i<=n;i++){if(i!=ans_one){printf("%d %d\n",ans_one,i);}}continue;}if(two_exist){bool flag=true;for(int i=0;i<sz;i++){if(ans[i]%2!=0){flag=false;break;}}if(flag){puts("YES");printf("%d %d\n",two_pos,permutations[two_pos]);vis[two_pos]=false;vis[permutations[two_pos]]=false;for(int i=1;i<=n;i++){if(vis[i]){int counts=0;vis[i]=false;int ni=i;printf("%d %d\n",two_pos,ni);while(vis[permutations[ni]]){if(counts&1){counts^=1;printf("%d %d\n",permutations[ni],two_pos);}else{counts^=1;printf("%d %d\n",permutations[two_pos],permutations[ni]);}vis[permutations[ni]]=false;ni=permutations[ni];}}}continue;}}puts("NO");}return 0;
}

转载于:https://www.cnblogs.com/jie-dcai/p/4803240.html

CF #319 div 2 D相关推荐

  1. CF #366(div.2) C 模拟,思维

    CF #366(div.2)  C.  Thor 题意:一个手机n个联系人,有q个操作.每次给出ty和ai,如ty==1,表示收到ai的一条信息:如ty==2,表示将ai发的信息都看掉:如ty==3, ...

  2. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

  3. cf #823 Div.2(A~C)

    Cf #823 Div.2 文章目录 Cf #823 Div.2 [A. Planets](https://codeforces.com/contest/1730/problem/A) [B. Mee ...

  4. cf #818 Div.2(A~C)

    Cf #818 Div.2 文章目录 Cf #818 Div.2 [A. Madoka and Strange Thoughts](https://codeforces.com/contest/171 ...

  5. CF #683 div.2

    CF #683 div.2 目前 ABCD A. Add Candies B. Numbers Box C. Knapsack D. Catching Cheaters 结尾 A. Add Candi ...

  6. CF#764(div.3A~D)dp进阶

    CF#764(div.3A~D)&&dp进阶 CF#764(div.3) Problem - A - Codeforces 题意 一个数列,每次操作可以使这个数列中的任何数加1,问最少 ...

  7. CF #764 Div.3(B ~D)

    CF #764 Div.3 B题 Make AP 给定a b c 使其中一个数 乘 任意正整数m 问是否能构成成差数列 我们可以想到等差数列的性质 2b=a+c2b = a + c 2b=a+c 思路 ...

  8. cf #825 Div.2(A~C2)

    Cf #825 Div.2 文章目录 Cf #825 Div.2 [A. Make A Equal to B](https://codeforces.com/contest/1736/problem/ ...

  9. edu cf #138 Div.2(A~D)

    edu cf #138 Div.2 文章目录 edu cf #138 Div.2 [A. Cowardly Rooks](https://codeforces.com/contest/1749/pro ...

  10. CF#320 Div.2 总结

    比赛网址:cf#320 Div.2 晚上11点开始的比赛,持续2个半小时.结束时有两道题题过了预测数据,分时是A题和C题. 比赛开始的时候,理所当然地从A题开始看起.A题比较容易,稍微分析一下就可以看 ...

最新文章

  1. MATLAB【七】———— matlab 高斯核使用,超像素图像模拟,矩阵转图像,深度相机模型实践实现
  2. 花了一上午,终于完成了作业
  3. android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测
  4. PyTorch 实现经典模型2:AlexNet
  5. 2017届蓝桥杯java_2017第八届蓝桥杯JavaC组决赛(国赛)试题汇总及试题详解-Go语言中文社区...
  6. oracle rac 中的ocr,11g rac中 ocr和 votingdisk疑问
  7. CentOS7加入windows 2008 AD域
  8. 深度学习之基于opencv和CNN实现人脸识别
  9. java中实现将一个数字字符串转换成逗号分隔的数字串, 即从右边开始每三个数字用逗号分隔
  10. 服务器虚拟化性能瓶颈怎么办,如何突破虚拟化三大瓶颈
  11. Java JDBC Druid
  12. Asp.net:DataList分页技术
  13. 【深度学习】你该会的精选面试题(一)
  14. 计算二叉树叶子结点数目(C语言)
  15. dep指定版本 go_Go语言包管理工具dep的安装与使用
  16. 不想被淘汰,大咖有话说——程序猿一定要学大数据?
  17. 【常用办公软件】万彩办公大师教程丨全能图片转换工具
  18. 支付宝服务商模式下的支付开发
  19. 酷6 期待“化茧成蝶”
  20. 如何安全快速的迁移你的系统到固态硬盘

热门文章

  1. 粉碎文件软件测试大乐,软件测试基础(面试)(27页)-原创力文档
  2. 输入输出系统的发展概况
  3. Synopsys MetaWare for Linux 安装与编译指南
  4. HTTP 传输内容的压缩
  5. sql2005性能优化(在32位系统上突破2G内存使用量的方法)
  6. [Linux实用工具]Linux监控工具munin的展示(Nginx)
  7. flume介绍及应用
  8. *-mapper.xml配置文件
  9. Jabber 创建一个application dial rule
  10. body标签子级被默认client width截断的解决方法