QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#420600 | #8718. 保区间最小值一次回归问题 | Scintilla# | WA | 383ms | 35320kb | C++20 | 2.9kb | 2024-05-24 20:32:03 | 2024-05-24 20:32:04 |
Judging History
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'