結果
| 問題 |
No.2665 Minimize Inversions of Deque
|
| コンテスト | |
| ユーザー |
chro_96
|
| 提出日時 | 2024-03-08 22:02:37 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 75 ms / 2,000 ms |
| コード長 | 1,520 bytes |
| コンパイル時間 | 1,611 ms |
| コンパイル使用メモリ | 30,720 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-09-29 19:38:57 |
| 合計ジャッジ時間 | 5,365 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
#include <stdio.h>
void add_segt (int *t, int idx, int val, int size) {
idx = idx+size-1;
t[idx] += val;
while (idx > 0) {
idx = (idx-1)/2;
t[idx] += val;
}
return;
}
int sum_segt_rec (int *t, int a, int b, int k, int l, int r) {
int ans = 0;
if (r <= a || b <= l) {
return 0;
}
if (a <= l && r <= b) {
return t[k];
}
ans = sum_segt_rec(t, a, b, 2*k+1, l, (l+r)/2);
ans += sum_segt_rec(t, a, b, 2*k+2, (l+r)/2, r);
return ans;
}
int sum_segt (int *t, int a, int b, int size) {
return sum_segt_rec(t, a, b, 0, 0, size);
}
int main () {
int t = 0;
int n = 0;
int p = 0;
int res = 0;
int a[400000] = {};
int st[524287] = {};
res = scanf("%d", &t);
while (t > 0) {
long long x = 0LL;
int hd = 0;
int tl = 0;
int size = 1;
res = scanf("%d", &n);
hd = n;
tl = n;
while (size <= n+1) {
size <<= 1;
}
for (int i = 0; i < 2*size-1; i++) {
st[i] = 0;
}
for (int i = 0; i < n; i++) {
int cnt = 0;
res = scanf("%d", &p);
cnt = sum_segt(st, 0, p, size);
if (cnt < i-cnt || (cnt == i-cnt && a[hd] > p)) {
hd--;
a[hd] = p;
x += (long long)cnt;
} else {
a[tl] = p;
tl++;
x += (long long)(i-cnt);
}
add_segt(st, p, 1, size);
}
printf("%lld\n", x);
printf("%d", a[hd]);
for (int i = hd+1; i < tl; i++) {
printf(" %d", a[i]);
}
printf("\n");
t--;
}
return 0;
}
chro_96