QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#150535#5507. InvestorsahsoltanWA 13ms3520kbC++172.6kb2023-08-25 20:11:562023-08-25 20:11:59

Judging History

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

  • [2023-08-25 20:11:59]
  • 评测
  • 测评结果:WA
  • 用时:13ms
  • 内存:3520kb
  • [2023-08-25 20:11:56]
  • 提交

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'