QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#42600 | #4429. Gebyte's Grind | antiravel | WA | 3995ms | 237756kb | C++23 | 3.2kb | 2022-08-02 19:24:16 | 2022-08-02 19:24:17 |
Judging History
answer
#include <bits/stdc++.h>
#include <limits>
#include <vector>
constexpr int64_t INF = std::numeric_limits<int64_t>::max() / 4;
struct node_t
{
int64_t p = 0, h = 0, l = 0;
node_t() = default;
node_t(int64_t p, int64_t h, int64_t l) :
p(std::min(INF, p)), h(std::min(INF, h)), l(std::min(INF, l))
{
}
};
node_t join(const node_t &a, const node_t &b)
{
if (a.h < b.p)
return {b.p + (a.p + a.l - a.h), b.h, b.l};
else if (a.h < b.p + b.h)
return {a.p, b.h, a.l + (b.p + b.l - a.h)};
else
return {a.p, b.h + (a.h - b.p - b.l), a.l};
}
struct segment_tree
{
std::vector<node_t> p;
segment_tree(int n) : p(4l * n) {}
void init(int u, int l, int r, const std::vector<node_t> &a)
{
if (r - l == 1)
p[u] = a[l];
else
{
int m = l + (r - l) / 2;
init(u + u, l, m, a);
init(u + u + 1, m, r, a);
p[u] = join(p[u + u], p[u + u + 1]);
}
}
void modify(int u, int l, int r, int pos, const node_t &v)
{
if (r - l == 1)
p[u] = v;
else
{
int m = l + (r - l) / 2;
if (pos < m)
modify(u + u, l, m, pos, v);
else
modify(u + u + 1, m, r, pos, v);
p[u] = join(p[u + u], p[u + u + 1]);
}
}
std::pair<node_t, int> lower_bound(
int u, int l, int r, int pl, const node_t &prev, const auto &pred)
{
if (pl <= l)
{
auto vv = join(prev, p[u]);
if (pred(vv))
return {vv, r};
}
if (r - l == 1)
return {prev, l};
else
{
int m = l + (r - l) / 2;
if (m <= pl)
{
return lower_bound(u + u + 1, m, r, pl, prev, pred);
}
else
{
auto la = lower_bound(u + u, l, m, pl, prev, pred);
if (la.second < m)
return la;
else
return lower_bound(u + u + 1, m, r, pl, la.first, pred);
}
}
}
};
int main()
{
int t;
scanf("%d", &t);
for (int i = 0; i < t; i++)
{
int n, q;
scanf("%d%d", &n, &q);
int64_t h;
scanf("%" SCNi64, &h);
auto read_node = [] -> node_t {
char type;
scanf(" %c", &type);
int v;
scanf("%d", &v);
if (type == 'B')
return {v + 1, 1, 0};
else if (type == 'K')
return {v, v, INF};
else
return {0, v, v};
};
std::vector<node_t> as(n);
for (int i = 0; i < n; i++)
as[i] = read_node();
segment_tree sgt(n);
sgt.init(1, 0, n, as);
for (int i = 0; i < q; i++)
{
char opt;
scanf(" %c", &opt);
if (opt == 'Z')
{
int p;
scanf("%d", &p);
p -= 1;
auto v = read_node();
sgt.modify(1, 0, n, p, v);
}
else
{
int pl;
scanf("%d", &pl);
pl -= 1;
// clang-format off
int pr = sgt.lower_bound(1, 0, n, pl, {0, 0, 0}, [h](const node_t &v) {
return h >= v.p;
}).second;
// clang-format on
if (pl == pr)
puts("-1");
else
printf("%d\n", pr);
}
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 3995ms
memory: 237756kb
input:
1 2000000 4000000 1000000000000 B 2982992025 B 1226542907 B 2299259203 B 1223702056 B 1407121251 B 340783317 B 1259091208 B 2101980047 B 2611543443 B 2010658889 B 4233714406 B 3112120167 B 2311876255 B 2789960428 B 3008572010 B 1 B 2464951378 B 1364240867 B 2829584762 B 2511437438 B 692948679 B 1113...
output:
830886 237551 1006759 1911618 1482435 995020 911266 594968 1956406 163030 1222474 213385 1606427 541216 578061 1277464 1641650 645516 900257 1009146 1720986 1905355 765240 1766532 991879 134357 140608 422999 378432 188154 555268 1019521 12846 1007200 623103 1143462 887097 856018 173817 1185152 16893...
result:
wrong answer 1st lines differ - expected: '833302', found: '830886'