[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 ...
随机推荐
- 将py文件打包到docx
import os class FileDownload: def __init__(self): self.exclude = ['db.sqlite3', 'logs', 'media', 'Pi ...
- 在Eclipse配置Tomcat服务器+JSP实例创建
欢迎任何形式的转载,但请务必注明出处. 1.jdk安装及环境配置 点击进入教程 2.Eclipse安装 点击进入官网下载 注意下载完成打开.exe后,出现的界面,有很多版本供选择.选择下图版本 3.T ...
- Vue指令之事件修饰符
事件修饰符: + .stop 阻止冒泡 + .prevent 阻止默认事件 + .capture 添加事件侦听器时使用事件捕获模式 + .self 只当事件在该元素本身(比如不是子元素)触发时触发回调 ...
- docker 部署oracle
Oracle数据库服务器Docker映像文档 Oracle Database Server 12c R2是行业领先的关系数据库服务器.Oracle数据库服务器Docker映像包含在Oracle Lin ...
- 简述FTP的主动模式与被动模式(精简)
一.主被动 主动: 客户端从任意一个大于1024的端口现在假设为1234(非特权端口)连接到服务端的21端口(命令端口),随之客户端监听端口(N+1)即为1235端口(可以理解为这是客户端认定的数据端 ...
- SQL SERVER-邮件配置
存储发邮件 USE msdb GO EXEC sp_send_dbmail @profile_name = 'mail_pro', @recipients='Jinwei.chang@quantacn ...
- imx6q 启动logo
转:https://wenku.baidu.com/view/81fa0f3982c4bb4cf7ec4afe04a1b0717fd5b30e.html?rec_flag=default&sx ...
- C++——构造函数 constructor
What is constructor C++中,如果你想要创建一个object,有一个函数会自动被调用(不需要programmer显式调用 ),这个函数就是constructor; construc ...
- C#中流Stream的使用-学习
概念 提供字节序列的一般视图.这是一个抽象类. 子类: Derived Microsoft.JScript.COMCharStream System.Data.OracleClient.OracleB ...
- Spring Boot全局异常处理
本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下 1.后台处理异常 a.引入thymeleaf依赖 <!-- thymeleaf模板插件 --> <dep ...