結果
問題 | No.2382 Amidakuji M |
ユーザー | random contestant |
提出日時 | 2023-07-14 22:15:34 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 98 ms / 2,000 ms |
コード長 | 2,170 bytes |
コンパイル時間 | 4,398 ms |
コンパイル使用メモリ | 268,440 KB |
実行使用メモリ | 18,816 KB |
最終ジャッジ日時 | 2024-09-16 07:19:00 |
合計ジャッジ時間 | 6,270 ms |
ジャッジサーバーID (参考情報) |
judge1 / 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; }