[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 ...
随机推荐
- 《程序是怎样跑起来的》读书笔记——第一章 对程序员来说CPU是什么
1 程序的运行流程 2 CPU的组成 3 寄存器的主要种类和功能 "程序计数器"--决定程序流程的 4 条件分支和循环机制 4.1 顺序执行 4.2 选择分支 5 函数的调用机制 ...
- 打印html页面
// 打印类属性.方法定义 const Print = function (dom, options) { if (!(this instanceof Print)) return new Print ...
- [LeetCode] 1029. 两地调度 ☆(贪心)
官方题解 作差排序 描述 公司计划面试 2N 人.第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]. 返回将每个人都飞到某座城市的最低费用,要求每个 ...
- 【DRF框架】序列化组件——字段验证
单个字段的验证 1.在序列化器里定义校验字段的钩子方法 validate_字段 2.获取字段的数据 3.验证不通过,抛出异常 raise serializers.ValidationError( ...
- 创建第一kubernetes应用以及基本操作(六)
1.创建一个测试用的deployment kubectl run net-test --image=alpine --replicas= sleep 2.查看获取IP情况 [root@linux ~] ...
- HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节
HDU-5728-PowMod-求phi(i*n)前缀和+指数循环节 [Problem Description] 令\(k=\sum_{i=1}^m \varphi(i\cdot n)\ mod \ ...
- jquery基础知识3
1.jquery的位置信息 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Linux基础之终端、控制台、tty、pty等概念简介
基本概念: 1>tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被 ...
- async/await中reject的问题
promise 返回的 resolve 对象可能用 await 去接,但是 reject 无法用 await 接收到,所以要用 try catch 去处理 例如发送邮件的接口设置: async fun ...
- 10 loader - 配置处理less文件的loader
第一步:装包 cnpm i less-loader -D 安装完提示警告 peerDependencies WARNING less-loader@* requires a peer of less@ ...