QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#515312 | #5507. Investors | 2huk | TL | 17ms | 146140kb | C++20 | 1.6kb | 2024-08-11 17:03:01 | 2024-08-11 17:03:06 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 6010;
int n, k, a[N];
int w[N][N]; // [l, r] 内的逆序对数
struct BIT {
int tr[N];
void modify(int u, int x) {
for (int i = u; i <= 6000; i += i & -i) tr[i] += x;
}
int query(int u) {
if (u < 0) return 0;
int res = 0;
for (int i = u; i; i -= i & -i) res += tr[i];
return res;
}
void clear() {
memset(tr, 0, sizeof tr);
}
}T;
int f[N][N];
void solve(int k, int l, int r, int ql, int qr) {
// cout << l << ' ' << r << '\n';
if (l == r) {
for (int i = ql; i <= qr; ++ i )
f[k][l] = min(f[k][l], f[k][i] + w[i + 1][l]);
return;
}
int mid = l + r >> 1;
int M = -1;
for (int i = ql; i <= qr && i < mid; ++ i )
if (M == -1 || f[k][mid] > f[k - 1][i] + w[i + 1][mid]) {
f[k][mid] = f[k - 1][i] + w[i + 1][mid];
M = i;
}
// cout << M << '\n';
solve(k, l, mid, ql, M);
solve(k, mid + 1, r, M, qr);
}
int solve() {
cin >> n >> k;
for (int i = 1; i <= n; ++ i ) cin >> a[i];
for (int l = 1; l <= n; ++ l ) {
T.clear();
for (int r = l; r <= n; ++ r ) {
w[l][r] = w[l][r - 1] + T.query(6000) - T.query(a[r]);
T.modify(a[r], 1);
}
}
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
// for (int i = 0; i <= n; ++ i )
// for (int j = 0; j <= n; ++ j )
// f[i][j] =
for (int i = 1; i <= k; ++ i ) {
solve(i, 1, n, 0, n - 1);
}
return f[k][n];
}
int main() {
int T;
cin >> T;
while (T -- ) cout << solve() << '\n';
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 17ms
memory: 146140kb
input:
2 6 1 4 5 6 2 2 1 6 2 4 5 6 2 2 1
output:
2 0
result:
ok 2 lines
Test #2:
score: -100
Time Limit Exceeded
input:
349 6 2 2 1 2 1 2 1 48 12 42 47 39 39 27 25 22 44 45 13 5 48 38 4 37 6 24 10 42 38 12 37 31 19 44 6 29 17 7 12 7 26 35 24 15 9 37 3 27 21 33 29 34 20 14 30 31 21 48 12 1 43 17 46 17 39 40 22 25 2 22 12 4 11 38 12 4 11 1 5 39 44 37 10 19 20 42 45 2 45 37 20 48 34 16 41 23 18 13 44 47 21 29 4 23 18 16...
output:
1 0 0 110 0 0 0 0 0 0 0 0 0 0