結果
| 問題 |
No.366 ロボットソート
|
| コンテスト | |
| ユーザー |
🍡yurahuna
|
| 提出日時 | 2016-04-24 08:36:40 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 1,468 bytes |
| コンパイル時間 | 2,032 ms |
| コンパイル使用メモリ | 175,920 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-29 17:18:56 |
| 合計ジャッジ時間 | 2,984 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i=0;i<(n);i++)
#define rep2(i,a,b) for (int i=(a);i<(b);i++)
#define rrep(i,n) for (int i=(n)-1;i>=0;i--)
#define rrep2(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define all(a) (a).begin(),(a).end()
typedef long long ll;
typedef pair<int, int> P;
const int MAX_N = 1 << 18;
// [1, n]
// BIT is initialized by zeros
// !!initialize the size ""N""!!
int bit[MAX_N + 1], N, K;
void init() {
fill(bit, bit + N, 0);
}
// get sum in [1, i]
// sum{[i, j]} = sum{[1, j]} - sum{[1, i-1]}
int sum(int i) {
int s = 0;
while (i > 0) {
s += bit[i];
i -= i & -i;
}
return s;
}
// add x to bit[i]
void add(int i, int x) {
while (i <= N) {
bit[i] += x;
i += i & -i;
}
}
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> N >> K;
vector<int> a(N);
vector<P> b(N);
rep(i, N) {
cin >> a[i];
b[i] = P(a[i], i);
}
sort(all(b));
rep(i, N) {
if (b[i].second % K != i % K) {
cout << -1 << endl;
return 0;
}
a[b[i].second] = i + 1; // compress a[] to 1, 2, ...
}
reverse(all(a));
ll ans = 0;
// modグループごとに反転数を加算
rep(k, K) {
init();
for (int i = k; i < N; i += K) {
ans += sum(a[i] - 1);
add(a[i], 1);
}
}
cout << ans << endl;
}
🍡yurahuna