将其连有向边$(i,c_{i})$,由于每一个点出入度都为1,那么必然构成若干个环

对于每一个环,从一点出发,将搜到的点依次记录下来(直至返回自己),记作$v_{1},v_{2},...,v_{k}$,那么就有$c_{v_{i}}=v_{i+1}$(特别的,$c_{v_{k}}=v_{1}$)

显然可以将其看作一个$\{1,2,...,k\}$到$\{v_{1},v_{2},...,v_{k}\}$的映射,即可以简化为$\{2,3,...,n,1\}$如何解决,有一个$n+1$次的做法,具体操作过程如下:$(2,n)$,$(3,n)$,...,$(n-1,n)$,$(1,n)$,$(1,2)$,$(2,n)$

(特别的,当$n=2$,再找一个无关的数,参考样例中做法即可,也是3次)

如果每一个环都需要加1,那么最终次数就是$n+环数 $,显然次数过多

对于两个大小分别为$x$和$y$的环,类似上面将其描述为$\{2,3,...,x,1,x+2,...,x+y,x+1\}$,我们可以用$x+y$次将其解决,具体操作过程如下:$(x,x+y)$,$(1,x+y)$,$(2,x+y)$,...,$(x-1,x+y)$,$(x+1,x)$,$(x+2,x)$...,$(x+y-1,x)$,$(x,x+y)$

由此,将两个环配对,最终至多剩下一个环,再用前面的方式即可,至多$n+1$次

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mp make_pair
5 vector<int>v[N];
6 vector<pair<int,int> >ans;
7 int n,m,a[N],vis[N];
8 void dfs(int k){
9 if (vis[k])return;
10 v[m].push_back(k);
11 vis[k]=1;
12 dfs(a[k]);
13 }
14 int main(){
15 scanf("%d",&n);
16 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
17 for(int i=1;i<=n;i++)
18 if (!vis[i]){
19 m++;
20 dfs(i);
21 if (v[m].size()==1)v[m--].clear();
22 }
23 for(int i=1;i<m;i+=2){
24 int x=v[i].size(),y=v[i+1].size();
25 ans.push_back(mp(v[i][x-1],v[i+1][y-1]));
26 for(int j=0;j+1<x;j++)ans.push_back(mp(v[i][j],v[i+1][y-1]));
27 for(int j=0;j+1<y;j++)ans.push_back(mp(v[i+1][j],v[i][x-1]));
28 ans.push_back(make_pair(v[i].back(),v[i+1].back()));
29 }
30 if (m&1){
31 if (v[m].size()==2){
32 int x=1;
33 if (v[m][0]==1){
34 if (v[m][1]>2)x=2;
35 else x=3;
36 }
37 ans.push_back(mp(v[m][0],x));
38 ans.push_back(mp(x,v[m][1]));
39 ans.push_back(mp(x,v[m][0]));
40 }
41 else{
42 int x=v[m].size();
43 for(int i=1;i+1<x;i++)ans.push_back(mp(v[m][i],v[m][x-1]));
44 ans.push_back(mp(v[m][0],v[m][x-1]));
45 ans.push_back(mp(v[m][0],v[m][1]));
46 ans.push_back(mp(v[m][1],v[m][x-1]));
47 }
48 }
49 printf("%d\n",ans.size());
50 for(int i=0;i<ans.size();i++)printf("%d %d\n",ans[i].first,ans[i].second);
51 for(int i=0;i<ans.size();i++){
52 int x=ans[i].first,y=ans[i].second;
53 swap(a[x],a[y]);
54 a[x]*=-1,a[y]*=-1;
55 }
56 for(int i=1;i<=n;i++)assert(a[i]==i);
57 }

[cf1491G]Switch and Flip的更多相关文章

  1. Codeforces 1491G - Switch and Flip(构造题)

    Codeforces 题目传送门 & 洛谷题目传送门 obviously,难度高一点的构造题对我来说都是不可做题 首先考虑将排列拆成一个个置换环,也就是 \(\forall i\) 连边 \( ...

  2. HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等

    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502151385.html jQuery 缩放 旋转 裁剪图片 Image Cropper ...

  3. 基于layui+cropper.js实现上传图片的裁剪功能

    最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...

  4. jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )

    1.页面切换(data-transition)

  5. OpenJudge/Poj 1753 Flip Game

    1.链接地址: http://bailian.openjudge.cn/practice/1753/ http://poj.org/problem?id=1753 2.题目: 总时间限制: 1000m ...

  6. Glitch-free clock switch

    With multi-frequency clocks being used in today’s devices, it's necessary to switch the source of a ...

  7. Partition:分区切换(Switch)

    在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...

  8. java中if和switch哪个效率快

    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...

  9. [开源]QuickSwitchSVNClient,快速完成SVN Switch的工具

    在实际的开发中,我们一般使用SVN工具进行源代码的管理.在实际的产品开发中,根据项目的一些定制要求,往往需要对某一些代码的修改,但是又不想影响主要的开发,这个时候需要对当前的主分支做一些分支处理(br ...

随机推荐

  1. SAE助力南瓜电影7天内全面Severless

    作者:李刚(寻如),阿里云解决方案架构师 南瓜电影APP是国内领先的专注于影视精品化运营的垂直类视频产品,在移动互联网.IPTV.OTT等客户端,面向广大中产阶级精英群体,提供有异于院线及其他视频平台 ...

  2. JS 开发中数组常用的方法

    大家有没有想过,js数组为什么会有这么多的方法,没错,就是为了不同场景下处理数据的需要,就像设计模式一样,都是为了能更好的处理当前场景的需要. 首先怎么创建一个数组呢, // 两种方式 // 1,构造 ...

  3. SpringBoot-Thymeleaf模板引擎

    模板引擎,我们其实大家听到很多,其实jsp就是一个模板引擎,还有用的比较多的freemarker,包括SpringBoot给我们推荐的Thymeleaf,模板引擎有非常多,但再多的模板引擎,他们的思想 ...

  4. Win10开启剪贴板

    点击任务栏下方右侧的会话窗口 点击所有设置 在搜索栏中输入剪贴板,点击进入剪贴板设置 开启剪贴板历史记录 按下组合键win + v即可呼出剪贴板

  5. Flask的环境配置

      Flask django是大而全,提供所有常用的功能 flask是小而精,只提供核心功能 环境配置 为了防止 django和 flask环境相互冲突,可以使用 虚拟环境分割开 pip instal ...

  6. /usr/bin/python^M: bad interpreter: No such file or directory

    利用如下命令查看文件格式 :set ff 或 :set fileformat 可以看到如下信息 fileformat=dos 或 fileformat=unix 利用如下命令修改文件格式 :set f ...

  7. LDAP-初见

    目录 什么是LDAP? LDAP 协议能解决什么问题? Spring Boot中使用LDAP来统一管理用户信息 添加用户 连接LDAP服务端 什么是LDAP? LDAP 的全称是 Lightweigh ...

  8. SpringMVC、Spring、MyBatis整合(IDEA版)

    1 环境准备 1.1 软件架构 JDK 1.8 Spring 4.x Mybatis 3.x Maven 3.x MySQL 5.7 1.2 创建数据库 创建数据库,数据库名ssm-demo,字符集u ...

  9. Java:并发笔记-02

    Java:并发笔记-02 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 3. 共享模型之管程-1 本章内容-1 共享问题 synchronized 线程安全分 ...

  10. HITS算法简介

    1.算法名称 超文本敏感标题搜索 (Hyperlink-Induced Topic Search) 2.算法背景 HITS 算法是由康奈尔大学的Jon Kleinberg 博士于1997 年首先提出的 ...