博客
关于我
C. Crazy Diamond(思维+构造)
阅读量:238 次
发布时间:2019-03-01

本文共 2346 字,大约阅读时间需要 7 分钟。

    


思路:数字1和n在排序过程中具有特殊性,常被用作中转站进行值的交换。

对于小于等于n/2的数值,处理方式如下:首先将其与n交换位置,再将交换后的数值转移到1的位置。对于大于n/2+1的数值,处理方式与上述相似。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout << "#a# " << a << endl; using namespace std;const int maxn = "3e5+1000";typedef long long ll;typedef pair
P;inline LL read() { LL x = 0, f = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; }LL a[maxn], pos[maxn];vector

ans;void op(LL x, LL y) { ans.push_back({x, y}); swap(pos[a[x]], pos[a[y]]); swap(a[x], a[y]); }int main(void) { cin.tie(0); std::ios::sync_with_stdio(false); LL n; cin >> n; for (LL i = 1; i <= n; i++) { cin >> a[i]; pos[a[i]] = i; } for (LL i = 2; i <= n/2; i++) { if (pos[i] <= n/2) { op(pos[i], n); op(n, i); } else { op(pos[i], 1); op(1, n); op(n, i); } } for (LL i = n/2+1; i <= n; i++) { if (pos[i] > n/2) { op(pos[i], n); op(n, i); } else { op(pos[i], 1); op(1, n); op(n, i); } } <#include

经过优化后的版本:

    


数字1和n在排序过程中具有特殊性,常被用作中转站进行值的交换。

对于小于等于n/2的数值,处理方式如下:首先将其与n交换位置,再将交换后的数值转移到1的位置。对于大于n/2+1的数值,处理方式与上述相似。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout << "debug: " << a << endl; using namespace std;const int maxn = 300000 + 1000;typedef long long ll;typedef pair
P;inline ll read() { ll x = 0, f = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; }ll a[maxn], pos[maxn];vector

ans;void op(ll x, ll y) { ans.push_back({x, y}); swap(pos[a[x]], pos[a[y]]); swap(a[x], a[y]); }int main(void) { cin.tie(0); std::ios::sync_with_stdio(false); ll n; cin >> n; for (ll i = 1; i <= n; i++) { cin >> a[i]; pos[a[i]] = i; } for (ll i = 2; i <= n/2; i++) { if (pos[i] <= n/2) { op(pos[i], n); op(n, i); } else { op(pos[i], 1); op(1, n); op(n, i); } } for (ll i = n/2+1; i <= n; i++) { if (pos[i] > n/2) { op(pos[i], n); op(n, i); } else { op(pos[i], 1); op(1, n); op(n, i); } }

转载地址:http://cict.baihongyu.com/

你可能感兴趣的文章
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理一
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty相关
查看>>
Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
查看>>
Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
查看>>
Netty:原理架构解析
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>
Network Sniffer and Connection Analyzer
查看>>
Network 灰鸽宝典【目录】
查看>>
NetworkX系列教程(11)-graph和其他数据格式转换
查看>>
Networkx读取军械调查-ITN综合传输网络?/读取GML文件
查看>>
network小学习
查看>>
Netwox网络工具使用详解
查看>>
Net与Flex入门
查看>>
net包之IPConn
查看>>