結果
| 問題 |
No.2382 Amidakuji M
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-07-14 22:15:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 128 ms / 2,000 ms |
| コード長 | 2,170 bytes |
| コンパイル時間 | 4,250 ms |
| コンパイル使用メモリ | 258,280 KB |
| 最終ジャッジ日時 | 2025-02-15 14:12:04 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
// #define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
#define rep(i,n) for (ll i = 0; i < (n); ++i)
using vl = vector<ll>;
using vvl = vector<vl>;
using P = pair<ll,ll>;
#define pb push_back
#define int long long
#define double long double
#define INF (ll) 3e18
// Ctrl + Shift + B コンパイル
// Ctrl + C 中断
// ./m 実行
// 転倒数ライブラリ
// from ARC 120
// vl a とvl b を渡すことで
// vl a をvl b にするために必要なswap回数を出力する
// 不可能な場合は その旨を文章に出力する
// 不可能事の出力が必要な場合は
// 文章の位置を return -1にすることで
// 不可能判定が可能
template <typename T>
class fenwick {
public:
vector<T> fenw;
int n;
fenwick(int _n) : n(_n) {
fenw.resize(n);
}
void modify(int x, T v) {
while (x < n) {
fenw[x] += v;
x |= (x + 1);
}
}
T get(int x) {
T v{};
while (x >= 0) {
v += fenw[x];
x = (x & (x + 1)) - 1;
}
return v;
}
};
ll tentou(vl x, vl y) {
ll n = x.size();
vector<pair<ll, ll>> a(n), b(n);
for (ll i = 0; i < n; i++) {
a[i].first = x[i];
a[i].second = i;
}
for (ll i = 0; i < n; i++) {
b[i].first = y[i];
b[i].second = i;
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
vector<ll> p(n);
for (ll i = 0; i < n; i++) {
if (a[i].first != b[i].first) {
cout << -1 << '\n';
cout << "swapにより配列 a b を等しくすることは不可能です" << endl;
return 0;
}
p[a[i].second] = b[i].second;
}
fenwick<ll> fenw(n);
ll ans = 0;
for (ll i = n - 1; i >= 0; i--) {
ans += fenw.get(p[i]);
fenw.modify(p[i], 1);
}
return ans;
}
signed main(){
int n; cin >> n;
int m; cin >> m;
vl a(n);
vl b(n);
rep(i,n) cin >> a[i];
rep(i,n) b[i] = i+1;
int tent = tentou(a, b);
int k1 = tent / m * m;
if (k1 < tent) k1 += m;
int k2 = k1 + m;
if (k1 % 2 == tent % 2) {cout << k1 << endl; return 0;}
if (k2 % 2 == tent % 2) {cout << k2 << endl; return 0;}
cout << -1 << endl;
}