QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#420613#8718. 保区间最小值一次回归问题Scintilla#WA 364ms37368kbC++203.0kb2024-05-24 20:39:152024-05-24 20:39:16

Judging History

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

  • [2024-05-24 20:39:16]
  • 评测
  • 测评结果:WA
  • 用时:364ms
  • 内存:37368kb
  • [2024-05-24 20:39:15]
  • 提交

answer

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <bitset>
#include <vector>
#include <random>
#include <cassert>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#include <unordered_map>

using namespace std;

#define rep(i, s, e) for (int i = s; i <= e; ++i)
#define per(i, s, e) for (int i = s; i >= e; --i)
#define file(a) freopen(#a".in", "r", stdin), freopen(#a".out", "w", stdout)
#define pv(a) cout << #a << " = " << a << endl
#define pa(a, l, r) cout << #a " : "; rep(_, l, r) cout << a[_] << " \n"[_ == r]

using i64 = long long;

const i64 inf = 1e18;

const int N = 5e5 + 10;

int read() {
  int x = 0, f = 1; char c = getchar();
  for (; c < '0' || c > '9'; c = getchar()) if (c == '-') f = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + (c - 48);
  return x * f;
}

int n, m, a[N], bd[N], mx[N];
i64 f[N], pre[N], ans;
struct node {
  int l, r, k;
  node() {}
  friend bool operator < (node u, node v) {
    return u.k < v.k;
  }
} o[N];
map <int, vector <int>> pos;
map <int, vector <node>> lim;

int fa[N];
int get(int u) { return u == fa[u] ? u : fa[u] = get(fa[u]); }
void merge(int u, int v) { fa[get(v)] = get(u); }

void solve() {
  n = read(), m = read(), ans = 0;
  pos.clear(), lim.clear();
  rep(i, 1, n) a[i] = read();
  rep(i, 1, m) {
    o[i].l = read(), o[i].r = read(), o[i].k = read();
    lim[o[i].k].emplace_back(o[i]);
  }
  sort(o + 1, o + m + 1);
  rep(i, 1, n) fa[i] = i, bd[i] = -1;
  per(i, m, 1) {
    for (int p = o[i].r; (p = get(p)) >= o[i].l; merge(p - 1, p)) bd[p] = o[i].k;
  }
  rep(i, 1, n) if (~bd[i]) pos[bd[i]].emplace_back(i);
  // pa(bd, 1, n);
  for (auto [k, vec] : lim) {
    if (pos[k].empty()) {
      printf("-1\n");
      return;
    }
  }
  for (auto [k, vec] : pos) {
    // cout << "--- k = " << k << endl;
    int w = vec.size();
    // pv(w);
    // pa(vec, 0, w - 1);
    rep(i, 1, w) {
      mx[i] = 0, f[i] = inf;
      pre[i] = pre[i - 1] + max(0, k - a[vec[i - 1]]);
    }
    for (auto it : lim[k]) {
      int l = lower_bound(vec.begin(), vec.end(), it.l) - vec.begin() + 1;
      int r = lower_bound(vec.begin(), vec.end(), it.r) - vec.begin() + 1;
      if (l > r) {
        printf("-1\n");
        return;
      }
      // cout << "l, r = " << l << ' ' << r << endl;
      mx[r] = max(mx[r], l);
    }
    deque <int> q;
    q.push_back(0);
    rep(i, 1, w) {
      mx[i] = max(mx[i], mx[i - 1]);
      f[i] = f[i - 1];
      while (q.size() && q.front() < mx[i]) q.pop_front();
      if (q.size()) f[i] = min(f[i], f[q.front()] + pre[i - 1] - pre[q.front()]);
      f[i] += abs(k - a[vec[i - 1]]);
      while (q.size() && f[q.back()] >= f[i]) q.pop_back();
      q.push_back(i);
    }
    // pa(mx, 1, w);
    // pa(f, 1, w);
    // pa(g, 1, w);
    i64 res = inf;
    rep(i, mx[w], w) res = min(res, f[i]) + pre[w] - pre[i];
    ans += res;
  }
  printf("%lld\n", ans);
}

int main() {
  for (int tc = read(); tc; --tc) solve();
  return 0;
}

详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 16116kb

input:

1
3 2
2023 40 41
1 1 2022
2 3 39

output:

2

result:

ok 1 number(s): "2"

Test #2:

score: -100
Wrong Answer
time: 364ms
memory: 37368kb

input:

1000
100 100
1 35141686 84105222 84105220 7273527 178494861 178494861 112519027 77833654 77833656 261586535 278472336 278472336 261586536 416361017 416361017 426649080 323519513 278472337 420127821 420127823 420127823 482516531 434108818 420127821 631535744 615930922 546346921 546346920 546346920 70...

output:

51
47
48
45
51
51
53
47
49
50
50
58
997
57
54
59
48
63
59
49
51
54
44
55
53
58
51
45
43
44
41
54
59
48
59
47
51
45
37
46
45
56
47
55
965
982
49
52
53
53
49
44
61
52
45
47
56
56
54
50
39
49
50
43
56
42
53
52
40
52
55
49
46
49
49
52
46
50
44
46
49
42
46
48
53
48
49
46
44
48
50
41
52
56
46
44
46
54
52
...

result:

wrong answer 1st numbers differ - expected: '49', found: '51'