QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#417206 | #8718. 保区间最小值一次回归问题 | whxqwq | WA | 641ms | 98628kb | C++14 | 3.0kb | 2024-05-22 16:12:03 | 2024-05-22 16:12:04 |
Judging History
answer
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
void read (int &x) {
char ch = getchar(); x =0 ; while (!isdigit(ch)) ch =getchar();
while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
} const int N = 5e5 + 5;
int n, m, a[N];
vector<int> del[N], add[N];
#define pb push_back
struct qwq { int l, r, v; } b[N];
bool cmp (qwq x, qwq y) {
return x.v == y.v ? x.l < y.l : x.v < y.v;
}
multiset <int> s;
multiset <int>::iterator it;
int val[N];
vector<int> w[N]; vector<int>::iterator iw;
vector<pair<int, int> > seg[N];
#define ll long long
int L[N];
multiset<ll> u; ll f[N];
multiset<ll>::iterator iu;
ll calc (int x) {
int lim = 0;
// printf ("666 %d\n", val[x]);
// for (auto x : seg[x]) printf ("%d %d\n", x.first, x.second);
// for (int y : w[x]) printf ("%d ", y); puts ("");
for (auto i : seg[x]) {
int l = i.first, r = i.second;
iw = upper_bound (w[x].begin(), w[x].end(), r);
if (iw == w[x].begin()) return -1;
--iw; if (*iw < l) return -1;
// printf ("ok %d %d\n", x, *iw);
L[*iw] = max (L[*iw], l);
lim = max (lim, l);
}
int num = (int)w[x].size(), la = 0, tag = 1;
ll ans = 1e18;
u.insert (0);
for (int i = 1; i <= num; ++i) {
int now = w[x][i - 1];
// printf ("%d %d\n", now, )
if ((int)u.size() == 0) return -1;
f[i] = *u.begin() + abs (a[now] - val[x]);
u.insert (f[i]);
if (tag && L[now]) iu = u.find (0), u.erase (iu), tag = 0;
while (la < num && w[x][la] < L[now]) {
iu = u.find (f[la + 1]); u.erase (iu); ++la;
}
if (now >= lim) ans = min (ans, f[i]);
}
// printf ("hhh %lld\n", ans);
u.clear();
for (int y : w[x]) L[y] = 0;
return ans;
}
void work () {
read (n), read (m);
for (int i = 1; i <= n; ++i) read (a[i]);
for (int i = 1; i <= n; ++i) del[i].clear(), add[i].clear();
for (int i = 1, l, r, v; i <= m; ++i) {
read (l), read (r), read (v);
b[i] = (qwq){l, r, v}; val[i] = v;
}
sort (val + 1, val + m + 1);
int tot = unique (val + 1, val + m + 1) - val - 1;
for (int i = 1; i <= tot; ++i) seg[i].clear(), w[i].clear();
for (int i = 1; i <= m; ++i) {
int v = lower_bound (val + 1, val + tot + 1, b[i].v) - val;
b[i].v = v;
add[b[i].l].pb (v), del[b[i].r + 1].pb (v);
seg[v].push_back (make_pair (b[i].l, b[i].r));
}
s.clear ();
for (int i = 1; i <= n; ++i) {
for (int x : add[i]) s.insert (-x);
for (int x : del[i]) it = s.find (-x), s.erase (it);
if ((int)s.size() == 0) continue;
int now = *s.begin();
w[-now].push_back (i);
}
long long ans = 0;
for (int i = 1, t = 0; i <= tot; ++i) {
t = calc (i); ans += t; if (t == -1) return (void)puts("-1");
}
printf ("%lld\n", ans);
}
signed main() {
int T; read (T);
while (T--) work ();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 8ms
memory: 58980kb
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: 641ms
memory: 98628kb
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:
36 31 33 27 30 29 30 40 27 36 32 45 601 41 35 43 41 43 36 31 32 34 31 45 33 45 33 30 30 31 22 40 41 36 45 29 28 30 27 35 31 36 29 35 585 571 28 35 31 38 35 32 36 43 21 34 43 43 41 30 28 35 22 24 39 29 37 29 28 36 37 32 32 35 26 26 25 31 25 24 31 23 32 31 34 42 29 31 28 29 37 30 34 34 38 29 32 28 34 ...
result:
wrong answer 1st numbers differ - expected: '49', found: '36'