QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#420571#8718. 保区间最小值一次回归问题Scintilla#WA 357ms37388kbC++202.7kb2024-05-24 20:18:542024-05-24 20:18:54

Judging History

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

  • [2024-05-24 20:18:54]
  • 评测
  • 测评结果:WA
  • 用时:357ms
  • 内存:37388kb
  • [2024-05-24 20:18:54]
  • 提交

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], mn[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] : pos) {
    // cout << "--- k = " << k << endl;
    int w = vec.size(), mx = 0;
    // pv(w);
    // pa(vec, 0, w - 1);
    rep(i, 1, w) mn[i] = i, f[i] = pre[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;
      // cout << "l, r = " << l << ' ' << r << endl;
      mn[r] = min(mn[r], l), mx = max(mx, l);
    }
    deque <int> q;
    rep(i, 1, w) {
      f[i] = f[i - 1] + abs(k - a[vec[i - 1]]);
      while (q.size() && q.front() < mn[i]) q.pop_front();
      if (q.size()) f[i] = min(f[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(f, 1, w);
    // i64 res = inf;
    // rep(i, mx, w) res = min(res, f[i]);
    // ans += res;
    ans += f[w];
  }
  printf("%lld\n", ans);
}

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

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 357ms
memory: 37388kb

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:

57
57
57
56
56
59
55
50
60
55
51
70
1197
62
58
64
53
68
59
52
56
60
54
66
58
70
60
48
60
55
48
57
64
54
64
59
56
55
54
57
58
60
56
58
1130
1238
58
62
62
62
55
56
60
56
50
51
61
63
61
54
45
56
48
47
63
57
54
59
50
64
62
51
54
51
52
58
53
64
60
57
59
44
55
58
66
54
60
60
52
53
57
49
53
63
54
54
52
57
...

result:

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