QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#420600#8718. 保区间最小值一次回归问题Scintilla#WA 383ms35320kbC++202.9kb2024-05-24 20:32:032024-05-24 20:32:04

Judging History

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

  • [2024-05-24 20:32:04]
  • 评测
  • 测评结果:WA
  • 用时:383ms
  • 内存:35320kb
  • [2024-05-24 20:32:03]
  • 提交

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], g[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] = g[i] = inf;
    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] = g[i - 1] + abs(k - a[vec[i - 1]]);
      g[i] = f[i];
      while (q.size() && q.front() < mx[i]) q.pop_front();
      if (q.size()) g[i] = min(g[i], f[q.front()] + max(0, 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);
    ans += g[w];
  }
  printf("%lld\n", ans);
}

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

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 13988kb

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: 383ms
memory: 35320kb

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:

42
33
33
31
34
32
32
43
33
42
34
48
631
45
37
46
44
53
41
33
34
42
36
49
40
49
37
35
35
31
25
43
46
36
51
33
34
32
27
33
32
37
32
36
614
603
30
39
34
43
40
35
39
44
26
37
47
47
46
36
31
38
28
29
46
32
39
32
27
39
41
34
35
37
31
33
27
35
30
29
33
25
39
35
39
42
31
32
28
34
37
33
35
38
42
28
33
36
35
...

result:

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