QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#150514#5507. InvestorsahsoltanWA 12ms3504kbC++172.4kb2023-08-25 18:54:132023-08-25 18:54:14

Judging History

你现在查看的是最新测评结果

  • [2023-08-25 18:54:14]
  • 评测
  • 测评结果:WA
  • 用时:12ms
  • 内存:3504kb
  • [2023-08-25 18:54:13]
  • 提交

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';
  }
}

详细

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'