QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#150535 | #5507. Investors | ahsoltan | WA | 13ms | 3520kb | C++17 | 2.6kb | 2023-08-25 20:11:56 | 2023-08-25 20:11:59 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 2137
#endif
struct segtree {
struct node {
int add = 0;
int val = 0;
};
int n;
vector<node> tree;
segtree(int _n = 0) {
n = 1;
while (n < _n) {
n *= 2;
}
tree.resize(2 * n);
}
node join(const node& a, const node& b) {
node res;
res.val = max(a.val, b.val);
return res;
}
void push(int u, int) {
for (int v : {2 * u, 2 * u + 1}) {
tree[v].val += tree[u].add;
tree[v].add += tree[u].add;
}
tree[u].add = 0;
}
template<typename F>
void run(int u, int ul, int ur, int l, int r, bool mod, F&& f) {
if (ul >= l && ur <= r) {
f(u, ur - ul + 1);
return;
}
if (ul > r || ur < l) {
return;
}
push(u, ur - ul + 1);
int mid = (ul + ur) / 2;
run(2 * u, ul, mid, l, r, mod, f);
run(2 * u + 1, mid + 1, ur, l, r, mod, f);
if (mod) {
tree[u] = join(tree[2 * u], tree[2 * u + 1]);
}
}
node get(int l, int r) {
node res;
run(1, 0, n - 1, l, r, false, [&] (int u, int) {
res = join(res, tree[u]);
});
return res;
}
void modify(int l, int r, int a) {
run(1, 0, n - 1, l, r, true, [&] (int u, int) {
tree[u].add += a;
tree[u].val += a;
});
}
void modify(int i, int a) {
run(1, 0, n - 1, i, i, true, [&] (int u, int) {
tree[u].val = max(tree[u].val, a);
});
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while (tt--) {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
vector<vector<pair<int, int>>> b(n);
int inv = 0;
for (int i = 0; i < n; i++) {
int st = n;
int cnt = 0;
for (int j = i + 1; j < n; j++) {
if (a[i] > a[j]) {
st = min(st, j);
cnt++;
}
}
if (st < n) {
b[st].push_back({i + 1, cnt});
inv += cnt;
}
}
vector<segtree> dp(k + 1, segtree(n));
for (int i = 0; i < n; i++) {
for (int j = 1; j <= k; j++) {
dp[j].modify(i, dp[j - 1].get(0, i - 1).val);
}
for (int j = 1; j <= k; j++) {
for (auto [l, v] : b[i]) {
dp[j].modify(l, i, v);
}
}
}
int ans = 0;
for (int i = 0; i <= k; i++) {
ans = max(ans, dp[i].get(0, n - 1).val);
}
cout << inv - ans << '\n';
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3404kb
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
Wrong Answer
time: 13ms
memory: 3520kb
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 136 79 367 0 8 2 0 83 101 172 0 0 0 1 0 0 0 0 0 0 0 0 347 3 0 0 2 0 0 0 0 0 0 1 0 3 0 0 1 0 0 2 0 0 1 15 0 0 0 0 0 0 0 0 2 0 2 0 0 58 503 0 0 200 4 0 1 0 0 3 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 3 0 0 0 0 0 0 0 31 1 37 0 0 0 0 1 94 5 0 0 0 33 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 0 99...
result:
wrong answer 2nd lines differ - expected: '18', found: '136'