QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#151449#5507. InvestorsahsoltanTL 73ms3528kbC++172.5kb2023-08-26 17:42:482023-08-26 17:42:50

Judging History

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

  • [2023-08-26 17:42:50]
  • 评测
  • 测评结果:TL
  • 用时:73ms
  • 内存:3528kb
  • [2023-08-26 17:42:48]
  • 提交

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 val = 0;
    int add = 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].val += a;
      tree[u].add += 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>>> s(n);
    vector<int> p(n);
    int inv = 0;
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        if (a[j] < a[i]) {
          inv++;
          s[j].push_back({i + 1, 1});
        }
      }
    }
    vector<segtree> dp(k + 1, segtree(n));
    for (int i = 0; i < n; i++) {
      for (int j = k - 1; j >= 0; j--) {
        dp[j + 1].modify(i, dp[j].get(0, i - 1).val);
      }
      for (auto [l, w] : s[i]) {
        for (int j = 1; j <= k; j++) {
          dp[j].modify(l, i, w);
        }
      }
    }
    debug(inv);
    int ans = 0;
    for (int i = 0; i <= k; i++) {
      ans = max(ans, dp[i].get(0, n - 1).val);
    }
    cout << inv - ans << '\n';
  }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3420kb

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: 0
Accepted
time: 73ms
memory: 3528kb

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
13
13
23
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
34
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
8
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:

ok 349 lines

Test #3:

score: -100
Time Limit Exceeded

input:

6
1000 333
84886 84887 84732 83775 83776 83777 81234 80288 79661 79243 79244 78520 78521 78522 78523 78524 78525 79041 79042 78509 78120 77073 77432 77433 76111 75362 75363 75364 75365 75366 73979 73980 73981 73982 73983 73984 73472 73473 73075 72948 72949 72727 72728 72383 72384 72272 72273 72274 7...

output:


result: