QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#417186 | #8718. 保区间最小值一次回归问题 | whxqwq | TL | 8ms | 59112kb | C++14 | 2.7kb | 2024-05-22 15:53:21 | 2024-05-22 15:53:23 |
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<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 x : seg[x]) L[x.second] = max (L[x.second], x.first);
for (auto x : seg[x]) lim = max (lim, x.first);
int num = (int)w[x].size(), la = 0;
ll ans = 1e18;
u.insert (0);
for (int i = 1; i <= num; ++i) {
int now = w[x][i - 1];
// printf ("%d %d\n", now, )
f[i] = *u.begin() + abs (a[now] - val[x]);
u.insert (f[i]);
if (L[now] > 0) u.erase (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 (auto x : seg[x]) L[x.second] = 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 + m + 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; i <= tot; ++i) ans += calc (i);
printf ("%lld\n", ans);
}
signed main() {
int T; read (T);
for (int i = 1; i <= T && i <= 5; ++i) work ();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 8ms
memory: 59112kb
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
Time Limit Exceeded
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...