QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#150514 | #5507. Investors | ahsoltan | WA | 12ms | 3504kb | C++17 | 2.4kb | 2023-08-25 18:54:13 | 2023-08-25 18:54:14 |
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;
pair<int, int> mx = {0, 0};
};
int n;
vector<node> tree;
segtree(int _n = 0) {
n = 1;
while (n < _n) {
n *= 2;
}
tree.resize(2 * n);
for (int i = n - 1; i >= 0; i--) {
tree[n + i].mx.second = i;
}
}
node join(const node& a, const node& b) {
node res;
res.mx = max(a.mx, b.mx);
return res;
}
void push(int u, int) {
for (int v : {2 * u, 2 * u + 1}) {
tree[v].mx.first += 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].mx.first += 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];
}
segtree tree(n);
vector<vector<int>> b(n);
int inv = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (a[i] > a[j]) {
b[i + 1].push_back(j);
tree.modify(i + 1, j, 1);
inv++;
}
}
}
int ans = 0;
for (int i = 0; i < k; i++) {
auto [mx, p] = tree.get(0, n - 1).mx;
ans += mx;
for (int j = p; j >= 0; j--) {
while (!b[j].empty()) {
int r = b[j].back();
if (r >= p) {
tree.modify(j, r, -1);
b[j].pop_back();
} else {
break;
}
}
}
}
cout << inv - ans << '\n';
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3488kb
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: 12ms
memory: 3504kb
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 18 15 145 0 2 1 0 14 13 24 0 0 0 1 0 0 0 0 0 0 0 0 161 3 0 0 1 0 0 0 0 0 0 1 0 3 0 0 1 0 0 1 0 0 1 4 0 0 0 0 0 0 0 0 2 0 2 0 0 8 280 0 0 35 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 3 0 0 0 2 0 0 0 0 0 0 0 8 1 10 0 0 0 0 1 11 5 0 0 0 6 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 13 1 0 0 0...
result:
wrong answer 9th lines differ - expected: '13', found: '14'