这道题算不算脑洞题。。

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

666666

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. int permutations[100005];
  10. bool vis[100005];
  11. vector<int>ans;
  12.  
  13. int main(){
  14. int n;
  15. while(scanf("%d",&n)!=EOF){
  16. for(int i=1;i<=n;i++){
  17. scanf("%d",&permutations[i]);
  18. memset(vis,false,sizeof(vis));
  19. }
  20.  
  21. bool one_exist=false;
  22. bool two_exist=false;
  23. int two_pos=-1;
  24. int ans_one=-1;
  25. ans.clear();
  26. for(int i=1;i<=n;i++){
  27. if(!vis[i]){
  28. int cc=1;
  29. vis[i]=true;
  30. int ni=i;
  31. while(!vis[permutations[ni]]){
  32. ni=permutations[ni];
  33. vis[ni]=true;
  34. cc++;
  35. }
  36. if(cc==1){
  37. one_exist=true;
  38. ans_one=i;
  39. break;
  40. }
  41. if(cc==2){
  42. two_exist=true;
  43. two_pos=i;
  44. }
  45. ans.push_back(cc);
  46. }
  47. }
  48.  
  49. int sz=ans.size();
  50. if(one_exist){
  51. puts("YES");
  52. for(int i=1;i<=n;i++){
  53. if(i!=ans_one){
  54. printf("%d %d\n",ans_one,i);
  55. }
  56. }
  57. continue;
  58. }
  59.  
  60. if(two_exist){
  61. bool flag=true;
  62. for(int i=0;i<sz;i++){
  63. if(ans[i]%2!=0){
  64. flag=false;
  65. break;
  66. }
  67. }
  68. if(flag){
  69. puts("YES");
  70. printf("%d %d\n",two_pos,permutations[two_pos]);
  71. vis[two_pos]=false;
  72. vis[permutations[two_pos]]=false;
  73. for(int i=1;i<=n;i++){
  74. if(vis[i]){
  75. int counts=0;
  76. vis[i]=false;
  77. int ni=i;
  78. printf("%d %d\n",two_pos,ni);
  79. while(vis[permutations[ni]]){
  80. if(counts&1){
  81. counts^=1;
  82. printf("%d %d\n",permutations[ni],two_pos);
  83. }
  84. else{
  85. counts^=1;
  86. printf("%d %d\n",permutations[two_pos],permutations[ni]);
  87. }
  88. vis[permutations[ni]]=false;
  89. ni=permutations[ni];
  90. }
  91. }
  92. }
  93. continue;
  94. }
  95. }
  96.  
  97. puts("NO");
  98. }
  99. return 0;
  100. }

CF #319 div 2 D的更多相关文章

  1. 【DP】:CF #319 (Div. 2) B. Modulo Sum

    [题目链接]:http://codeforces.com/contest/577/problem/B [相似题目]:http://swjtuoj.cn/problem/2383/ [题意]:给出n个数 ...

  2. CF #319 div 2 E

    在一个边长为10^6正方形中,可以把它x轴分段,分成1000段.奇数的时候由底往上扫描,偶数的时候由上往下扫描.估计一下这个最长的长度,首先,我们知道有10^6个点,则y邮方向最多移动10^3*10^ ...

  3. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  4. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

  5. CF #374 (Div. 2) D. 贪心,优先队列或set

    1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...

  6. CF #374 (Div. 2) C. Journey dp

    1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...

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

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

  8. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组

    题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...

  9. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

    转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...

随机推荐

  1. java学习笔记_序列化

    如果父类没有实现Serializable接口,子类实现了Serializable接口,那么子类是可以序列化的. 但是如果想要反序列化,那么就需要父类支持默认构造函数. 因为在反序列化的过程中不会调用子 ...

  2. JVM中线程状态转换图

    JVM中线程的状态转换图 线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该 ...

  3. C#——接口的意义以及与抽象类的区别

    接口的意义是什么呢?接口与抽象类又有什么区别?什么情况选择用接口?什么情况选择用抽象类? 接口的意义: 1.实际开发中的约束作用,继承接口的类必须实现接口规定的方法,方便多人开发中的协同,避免随意性. ...

  4. windows ping 某个网段,不能运行指定的软件

    windows ping 某个网段,不能运行指定的软件 :begin @echo OFF color 0a Title Net Test Tool by:HRuinger Mode con cols= ...

  5. Tomcat服务器安装与第一个jsp网页程序

    1.安装tomcat服务器之前需要,先安装相应版本的jdk,个人理解Tomcat的大部分功能是使用了java的 jdk jar包的. jdk包下载方式网上可以查到 下载完后可以解压到一个指定目录,并在 ...

  6. Objective-C在ARC下结合GCD的单例模式和宏模版

    单例模式在iOS开发过程中经常用到,苹果提供过objective c单例的比较官方的写法: static MyGizmoClass *sharedGizmoManager = nil; + (MyGi ...

  7. 关于 实体类中 时间字段 为string 类型和 datatime类型 比较

    经发现, 数据库中保存时间格式数据  可以正常 排序, 数据中保存时间格式字符串 排序出现问题 /// <summary> /// 修改时间 /// </summary> pu ...

  8. 扩增子分析QIIME2-4分析实战Moving Pictures

    本示例的的数据来自文章<Moving pictures of the human microbiome>,Genome Biology 2011,取样来自两个人身体四个部位五个时间点   ...

  9. Slides使用

    1.引入 import { ViewChild } from '@angular/core'; import { Slides } from 'ionic-angular'; export class ...

  10. Java中字符串的常用属性与方法

    •字符串常用的属性 string.length()————>返回字符串的长度,int类型. •字符串常用的方法 String.contains(";")——————>判 ...