[cf1491G]Switch and Flip
将其连有向边$(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的更多相关文章
- Codeforces 1491G - Switch and Flip(构造题)
Codeforces 题目传送门 & 洛谷题目传送门 obviously,难度高一点的构造题对我来说都是不可做题 首先考虑将排列拆成一个个置换环,也就是 \(\forall i\) 连边 \( ...
- HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等
http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502151385.html jQuery 缩放 旋转 裁剪图片 Image Cropper ...
- 基于layui+cropper.js实现上传图片的裁剪功能
最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...
- jquery mobile页面切换效果(Flip toggle switch)(注:jQuery移动使用的数据属性的列表。 )
1.页面切换(data-transition)
- OpenJudge/Poj 1753 Flip Game
1.链接地址: http://bailian.openjudge.cn/practice/1753/ http://poj.org/problem?id=1753 2.题目: 总时间限制: 1000m ...
- Glitch-free clock switch
With multi-frequency clocks being used in today’s devices, it's necessary to switch the source of a ...
- Partition:分区切换(Switch)
在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...
- java中if和switch哪个效率快
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
- [开源]QuickSwitchSVNClient,快速完成SVN Switch的工具
在实际的开发中,我们一般使用SVN工具进行源代码的管理.在实际的产品开发中,根据项目的一些定制要求,往往需要对某一些代码的修改,但是又不想影响主要的开发,这个时候需要对当前的主分支做一些分支处理(br ...
随机推荐
- ch_nginx.sh
#!/bin/bash counter=`ps -ef |grep nginx |grep -v grep | wc -l` if [ $counter = 0 ];then service ngin ...
- SpringBoot整合Mabatis
1.导入 MyBatis 所需要的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <ar ...
- 2020.11.14-pta天梯练习赛补题
7-7 矩阵A乘以B 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有Ra行.Ca列,B有Rb行.Cb列,则只有Ca ...
- javascript-jquery的基本方法
1.去除字符串中两端的空格$.trim(str) var str1=" 123 " $.trim(str1);//123 2.遍历对象的数据并进行操作$.each(obj,func ...
- 初始CSS01
CSS基础知识 CSS介绍 CSS全称为层叠样式表,与HTML相辅相成,实现网页的排版布局与样式美化. 使用方式 根据样式表在页面中呈现的方式不同,可以通过以下三种方式在页面中使用格式 内联样式 改样 ...
- 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort
概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
- DDD领域驱动设计-项目包结构说明-Ⅳ
基于DDD领域驱动设计的思想,在开发具体系统时,需要先建立不同的层级包.主要是梳理不同层面(应用层,领域层,基础设施层,展示层)包括的功能目录,每一个层面应该包括哪些模块.本例所讲述的分层是DDD落 ...
- 【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
编写Java Spring Boot应用,通过配置logging.path路径把日志输出在指定的文件夹中. 第一步:通过VS Code创建一个空的Spring Boot项目 第二步:在applicat ...
- 数组中重复的数字 牛客网 剑指Offer
数组中重复的数字 牛客网 剑指Offer 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中 ...