[Codeforces1148C]Crazy Diamond——构造
题目链接:
[Codeforces1148C]Crazy Diamond
题目大意:
给出一个$1\sim n$的排列要求将其排序,每次能交换两个位置的数当且仅当这两个位置下标差的绝对值大于等于$\frac{n}{2}$。要求输出一组操作数不大于$5n$的方案并保证一定有解。
先不考虑操作需要的限制条件,那么要将排列排好序只需要第$i$次将$i$与下标为$i$的那个数调换一下即可。
现在有了限制条件显然不能直接调换,我们考虑借助别的数来完成这两个数的交换。
假设需要交换的两个位置的下标分别为$x$和$y$且$y>x$。
当$\frac{n}{2}\le y-x$时,直接交换即可。
当$x>\frac{n}{2}$时,显然$x,y$都能和$1$位置交换:
$1,x,y$
$x,1,y$
$y,1,x$
$1,y,x$
当$y\le \frac{n}{2}$时,$x,y$都能和$n$位置交换,方法同上。
当$x\le \frac{n}{2},y>\frac{n}{2}且y-x<\frac{n}{2}$时,显然只依靠$1$或$n$无法完成,但$1$和$y$能交换,$x$和$n$也能交换:
$1,x,y,n$
$y,x,1,n$
$y,n,1,x$
$x,n,1,y$
$1,n,x,y$
$1,y,x,n$
可以发现这样操作对于每个点最多需要$5$次操作就能使它归位,所以$5n$次操作内一定能完成。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int a[300010];
int b[300010];
int ans[1500010][2];
int cnt;
void get(int x,int y)
{
ans[++cnt][0]=x,ans[cnt][1]=y;
b[a[x]]=y;
b[a[y]]=x;
swap(a[x],a[y]);
}
void solve(int x,int y)
{
if(x==y)return ;
if(x>y)swap(x,y);
if(y-x>=m)get(x,y);
else if(x>m)
{
get(1,x);
get(1,y);
get(1,x);
}
else if(y<=m)
{
get(y,n);
get(x,n);
get(y,n);
}
else
{
get(1,y);
get(x,n);
get(1,n);
get(1,y);
get(x,n);
}
}
int main()
{
scanf("%d",&n);m=n/2;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]=i;
}
for(int i=1;i<=n;i++)
{
solve(i,b[i]);
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++)
{
printf("%d %d\n",ans[i][0],ans[i][1]);
}
}
[Codeforces1148C]Crazy Diamond——构造的更多相关文章
- Codeforces Global Round 3
Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...
- Codeforces Global Round 3(A-D)
我凉了..感觉自己啥都不会做,搞不好起床就绿了啊 代码和反思起床补,今天要反了个大思的 A. Another One Bites The Dust 把所有的ab排在一起然后两边叉a和b #includ ...
- Codeforces Round #342 (Div. 2) C. K-special Tables 构造
C. K-special Tables 题目连接: http://www.codeforces.com/contest/625/problem/C Description People do many ...
- ZEDGRAPH画图心得,SQL语句构造!!!
/// <summary> /// 画折线 /// </summary> public void Drawline() { OleDbConnection odcConnect ...
- HDU 3157 Crazy Circuits (有源汇上下界最小流)
题意:一个电路板,上面有N个接线柱(标号1~N) 还有两个电源接线柱 + - 然后是 给出M个部件正负极的接线柱和最小电流,求一个可以让所有部件正常工作的总电流. 析:这是一个有源汇有上下界的 ...
- 淘宝Diamond架构分析
转载:http://blog.csdn.net/szwandcj/article/details/51165954 早期的应用都是单体的,配置修改后,只要通过预留的管理界面刷新reload即可.后来, ...
- HDU 3157 Crazy Circuits
Crazy Circuits Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ...
- 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
- 一步步构造自己的vue2.0+webpack环境
前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...
随机推荐
- 编写Postgres扩展之四:测试
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-iv/ 编译:http://big-elephants.com ...
- ReactNative报错null is not an object (evaluating '_rngesturehandlermodule.default.direction')
程序报错: null is not an object (evaluating 'rngesturehandlermodule.default.direction') 解决: react-native ...
- FreeRTOS 移植
添加FreeRTOS源码到工程中 在工程源码中创建FreeRTOS目录存放拷贝的文件 拷贝FreeRTOS->Source中的文件 可将其他不需要的文件夹全部删掉,只留3个 拷贝Demo中Fre ...
- RocketMQ问题
RocketMQ原理(4)——消息ACK机制及消费进度管理 RocketMQ消费者,设置setConsumeFromWhere无效的问题 MQ的CONSUME_FROM_LAST_OFFSET未生效 ...
- Linux proc filesystem (procfs)
参考:/proc /proc简介 本文着重关注/proc目录,查看其中文件并熟悉它. /proc目录存在于所有Linux系统上,无论什么发行版或体系结构.首先,必须澄清一个误解: 就文件系统这一术语而 ...
- Linux常用命令【1】
打包和压缩文件 : cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd ...
- 如何使用Feign构造多参数的请求
原文:http://www.itmuch.com/spring-cloud-sum/feign-multiple-params/ 本节来探讨如何使用Feign构造多参数的请求.笔者以GET及POST请 ...
- P1338 末日的传说[水题]
题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...
- python常用内置方法
常用内建函数# 如何在遍历一个列表的同时获取当前下标? # 普通人的做法 list = [1, 2, 3, 4, 5, 6] index = 0 for i in list: print('下标%s' ...
- machine learning(9) -- classification:Decision boundary
machine learning(9) -- classification:Decision boundary 上图的decision boundary是一条直线,是属于预测函数的一个属性(当参数已经 ...