【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

想把数字i从位置j移动到位置i
可以这样。
假设mov(x,y)表示将(x..x+len/2-1)和(x+len/2..y)交换。
则可以先进行mov(j,i-1)操作。 (如果(j,i-1)的长度为奇数,终点就变为i-2)
令len = (i-1)-j+1 //当然长度为奇数的时候就是(i-2)-j+1了
x = j+len/2
=>x就是数字i新的位置
然后令len2 = i-x;
然后再进行一次mov(x-len2+1,i)操作就可以了。
这样x就能到达i所在的位置了。
且不会影响到i+1..n这些数字(它们已经用同样的规则放好到了原位置,即是i是逆序归位的
之所以要先进行一次mov(j,i-1)操作.是为了能让那个x-len2+1尽可能地大。
不让它小于1,因为=1了
(因为i相当于从左半边翻转到右半边了,那么i的左半部分肯定有len2个数字的。
(暴力翻转并没有超时呀
(每个数字只会做两次,所以最多只会有20000次操作

【代码】

/*
1.Shoud it use long long ?
2.Have you ever test several sample(at least therr) yourself?
3.Can you promise that the solution is right? At least,the main ideal
4.use the puts("") or putchar() or printf and such things?
5.init the used array or any value?
6.use error MAX_VALUE?
7.use scanf instead of cin/cout?
8.whatch out the detail input require
*/
/*
一定在这里写完思路再敲代码!!!
*/
#include <bits/stdc++.h>
#define index fuck_index
using namespace std; const int N = 1e4; int n,a[N+10],index[N+10];
vector<pair<int,int> > v; void fanzhuan(int l,int r){
if (l==r) return;
v.push_back({l,r});
int len = r-l+1;
int mid = l+len/2-1;
for (int i = l;i <= mid;i++){
swap(a[i],a[i+len/2]);
index[a[i]] = i;
index[a[i+len/2]] = i+len/2;
}
} int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
int T;
cin >> T;
while (T--){
v.clear();
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i],index[a[i]] = i;
for (int i = n;i >= 2;i--){
int x = index[i],y = i;
if (x==y) continue;
if (x>y) swap(x,y);
int ty = y-1; int len = ty-x+1;
if (x!=ty){
if ((len)&1) ty--,len--;
if (x!=ty)fanzhuan(x,ty);
} x = x+len/2;
len = y-x;
x = x - len+1;
fanzhuan(x,y);
}
cout <<(int) v.size()<<endl;
for (auto temp:v){
cout <<temp.first<<' '<<temp.second<<endl;
}
}
return 0;
}

最新文章

  1. soui中subscribeEvent订阅控件消息与宏订阅注意事项
  2. 解决MongoDB磁盘IO问题的三种方法
  3. scope=&#39;request&#39;的bean预加载冲突
  4. Codeforces Round #375 (Div. 2) - D
  5. C# Math
  6. MS SQL Server之光标、存储过程和触发器
  7. TopFreeTheme精选免费模板【20130827】
  8. Android开发之源码:多次点击事件的原理和实现
  9. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记
  10. UI基础视图----UIScrollView总结
  11. CCF-201409-2-画图
  12. Linux 高速操作IOport
  13. RobotFramework + Appium 移动自动化实现
  14. ZooKeeper Administrator&#39;s Guide A Guide to Deployment and Administration(吃别人嚼过的馍没意思,直接看官网资料)
  15. 【全网最全的博客美化系列教程】01.添加Github项目链接
  16. 获取修改value
  17. C++ 调用 opencv 读取视频文件列表并处理
  18. iOS - 使用WKWebView时OC调JS的user-select属性控制用户操作
  19. 转:动态计算UITableViewCell高度详解
  20. MVC相关资料收集

热门文章

  1. 洛谷 P4148 简单题 KD-Tree 模板题
  2. [USACO12MAR]摩天大楼里的奶牛(状态压缩DP)
  3. subline Text3 插件安装
  4. PKU 2411 Mondriaan&#39;s Dream 状态DP
  5. LINUX设备驱动程序笔记(一)设备驱动程序简单介绍
  6. JSP编程技术5-购物车的实现-session会话对象
  7. Introduction to IIS Architectures
  8. Java中二进制字节与十六进制互转
  9. zzulioj--1801--xue姐的小动物(水题)
  10. UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明