[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 ...
随机推荐
- 纯净Ubuntu16安装CUDA(9.1)和cuDNN
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 从源码分析node-gyp指定node库文件下载地址
当我们安装node的C/C++原生模块时,涉及到使用node-gyp对C/C++原生模块的编译工作(configure.build).这个过程,需要nodejs的头文件以及静态库参与(后续称库文件)对 ...
- SpringBoot-集成SpringSecurity
在 Web 开发中,安全一直是非常重要的一个方面. 安全虽然属于应用的非功能性需求,但是从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中. Spring Security官网 ...
- 八大排序算法之基数排序(python实现)
[写在前面] 参考文章: https://blog.csdn.net/nrsc272420199/article/details/82691596[给出的示例图,简单易懂,但是对于没一轮循环没有讲解的 ...
- 永久修改alias
永久修改alias home目录下ls -a显示隐藏文件 编辑./cshrc
- dubbo注册中心占位符无法解析问题(二)
dubbo注册中心占位符无法解析问题 前面分析了dubbo注册中心占位符无法解析的问题. 并给出了2种解决办法: 降低mybatis-spring的版本至2.0.1及以下 自定义MapperScann ...
- 【Java虚拟机9】类加载器之命名空间详解
前言 前面介绍类加载器的时候,介绍了一下命名空间这个概念.今天就通过一个例子,来详细了解一下[类加载器的命名空间].然后通过这个例子,我们可以总结一下双亲委托模型的好处与优点. 例1(不删除class ...
- 如何获取ISO8601定义的Work Week
工作中遇到一个需求,需要在打印标签的时候打印生产当天的工作周.工作周按照ISO-8601定义的标准计算.找到两种方案. Excel函数 C#代码 Excel函数 非常简单,调用一个Excel自带函数就 ...
- Java:Set接口小记
Java:Set接口小记 对 Java 中的 Set接口 与 其实现类,做一个微不足道的小小小小记 概述 public interface Set<E> extends Collectio ...
- NKOJ-4573 Falsita
问题描述: 到海边了呢...... 如果没有那次选择,现在是不是会好些呢...... 都过去了. 仰望着星空,迎面吹过一阵阵海风,倚靠着护栏,Fine 在海边静静地伫立着,在一个个无际的长夜后,Fin ...