博客
关于我
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/

你可能感兴趣的文章
Objective-C实现普通矩阵A和B的乘积(附完整源码)
查看>>
Objective-C实现更新数字指定偏移量上的值updateBit算法(附完整源码)
查看>>
Objective-C实现最大类间方差法OTSU算法(附完整源码)
查看>>
Objective-C实现最大非相邻和算法(附完整源码)
查看>>
Objective-C实现最小二乘多项式曲线拟合(附完整源码)
查看>>
Objective-C实现最小路径和算法(附完整源码)
查看>>
Objective-C实现最快的归并排序算法(附完整源码)
查看>>
Objective-C实现最长公共子序列算法(附完整源码)
查看>>
Objective-C实现最长回文子串算法(附完整源码)
查看>>
Objective-C实现最长回文子序列算法(附完整源码)
查看>>
Objective-C实现最长子数组算法(附完整源码)
查看>>
Objective-C实现最长字符串链(附完整源码)
查看>>
Objective-C实现最长递增子序列算法(附完整源码)
查看>>
Objective-C实现有限状态机(附完整源码)
查看>>
Objective-C实现有限状态自动机FSM(附完整源码)
查看>>
Objective-C实现有限集上给定关系的自反关系矩阵和对称闭包关系矩阵(附完整源码)
查看>>
Objective-C实现朴素贝叶斯算法(附完整源码)
查看>>
Objective-C实现杰卡德距离算法(附完整源码)
查看>>
Objective-C实现极值距离算法(附完整源码)
查看>>
Objective-C实现构造n以内的素数表(附完整源码)
查看>>