QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#457142 | #964. Excluded Min | 541forever | WA | 11ms | 63496kb | C++20 | 7.8kb | 2024-06-29 08:23:10 | 2024-06-29 08:23:14 |
Judging History
answer
#include <bits/stdc++.h>
#define TEST(x) freopen(x ".in", "r", stdin), freopen("test.out", "w", stdout)
#define debug std::cerr << "Running on " << __FUNCTION__ << ' ' << __LINE__ << std::endl;
#define Ptn std::pair
#define fi first
#define se second
#define Arr std::vector
#define eb emplace_back
#define pb push_back
const int N = 5e5 + 5;
const int M = 5e5;
const int INF = 0x3f3f3f3f;
int n, q, a[N], ans[N], c[N], vis[N];
std::array<int, 3> Q[N];
Arr<int> pos[N];
inline int lowbit(int x) {return x & (-x);}
void add(int x, int y) { for (; x <= n; x += lowbit(x)) c[x] += y; }
int qry(int x)
{
int res = 0; for (; x; x -= lowbit(x)) res += c[x];
return res;
}
#define lc (p << 1)
#define rc (p << 1 | 1)
struct SegmentTree1
{
Ptn<int, int> mx[N << 2], mxr[N << 2], mnl[N << 2];
int tag[N << 2];
void upd(int p)
{
mx[p] = std::max(mx[lc], mx[rc]);
mxr[p] = std::max(mxr[lc], mxr[rc]);
mnl[p] = std::min(mnl[lc], mnl[rc]);
}
void pushdown(int p)
{
if (tag[p])
{
int t = tag[p]; tag[p] = 0;
tag[lc] += t, tag[rc] += t;
mx[lc].fi += t, mx[rc].fi += t;
}
}
void build(int p = 1, int L = 1, int R = q)
{
tag[p] = 0;
if (L == R) return mxr[p] = mx[p] = {-INF, L}, mnl[p] = {INF, L}, void();
int mid = (L + R) >> 1;
build(lc, L, mid), build(rc, mid + 1, R);
upd(p);
}
void change(int x, std::array<int, 3> y, int z = -INF, int p = 1, int L = 1, int R = q)
{
if (L == R) return mx[p] = {(z == -INF) ? (y[1] - y[0] + 1) : z, x}, mxr[p] = {y[1], x}, mnl[p] = {y[0], x}, void();
int mid = (L + R) >> 1; pushdown(p);
if (x <= mid) change(x, y, z, lc, L, mid);
else change(x, y, z, rc, mid + 1, R);
upd(p);
}
int qryL(int x, int p = 1, int L = 1, int R = q)
{
if (mxr[p].fi < x) return -1;
if (L == R) return L;
int mid = (L + R) >> 1; pushdown(p);
if (mxr[lc].fi >= x) return qryL(x, lc, L, mid);
else return qryL(x, rc, mid + 1, R);
}
int qryR(int x, int p = 1, int L = 1, int R = q)
{
if (mnl[p].fi > x) return -1;
if (L == R) return L;
int mid = (L + R) >> 1; pushdown(p);
if (mnl[rc].fi <= x) return qryR(x, rc, mid + 1, R);
else return qryR(x, lc, L, mid);
}
void modify(int l, int r, int x, int p = 1, int L = 1, int R = q)
{
if (l <= L && R <= r) return tag[p] += x, mx[p].fi += x, void();
int mid = (L + R) >> 1; pushdown(p);
if (l <= mid) modify(l, r, x, lc, L, mid);
if (r >= mid + 1) modify(l, r, x, rc, mid + 1, R);
upd(p);
}
int nxt(int x, int p = 1, int L = 1, int R = q)
{
if (mxr[p].fi < Q[x][1]) return q;
if (L == R) return L;
int mid = (L + R) >> 1; pushdown(p);
if (x <= mid)
{
if (mxr[lc].fi >= Q[x][1]) return nxt(x, lc, L, mid);
else return nxt(x, rc, mid + 1, R);
}
else return nxt(x, rc, mid + 1, R);
}
int pre(int x, int p = 1, int L = 1, int R = q)
{
// printf("pre : %d %d %d %d\n", x, p, L, R);
if (mnl[p].fi > Q[x][0]) return 0;
if (L == R) return Q[L][1];
int mid = (L + R) >> 1; pushdown(p);
if (x >= mid + 1)
{
if (mnl[rc].fi <= Q[x][0]) return pre(x, rc, mid + 1, R);
else return pre(x, lc, L, mid);
}
else return pre(x, lc, L, mid);
}
void del(int x, int p = 1, int L = 1, int R = q)
{
if (L == R) return mxr[p] = mx[p] = {-INF, L}, mnl[p] = {INF, L}, void();
int mid = (L + R) >> 1; pushdown(p);
if (x <= mid) del(x, lc, L, mid);
else del(x, rc, mid + 1, R);
upd(p);
}
} T1;
struct SegmentTree2
{
Ptn<int, int> mx[N << 2];
void upd(int p) { mx[p] = std::max(mx[lc], mx[rc]); }
void build(int p = 1, int L = 1, int R = q)
{
if (L == R) return mx[p] = {-INF, L}, void();
int mid = (L + R) >> 1;
build(lc, L, mid), build(rc, mid + 1, R);
upd(p);
}
void change(int x, int y, int p = 1, int L = 1, int R = q)
{
if (L == R) return mx[p] = {y, x}, void();
int mid = (L + R) >> 1;
if (x <= mid) change(x, y, lc, L, mid);
else change(x, y, rc, mid + 1, R);
upd(p);
}
Ptn<int, int> qry(int l, int r, int p = 1, int L = 1, int R = q)
{
if (l <= L && R <= r) return mx[p];
int mid = (L + R) >> 1;
Ptn<int, int> res = {-INF, -INF};
if (l <= mid) res = qry(l, r, lc, L, mid);
if (r >= mid + 1) res = std::max(res, qry(l, r, rc, mid + 1, R));
return res;
}
void del(int x, int p = 1, int L = 1, int R = q)
{
if (L == R) return mx[p] = {-INF, L}, void();
int mid = (L + R) >> 1;
if (x <= mid) del(x, lc, L, mid);
else del(x, rc, mid + 1, R);
upd(p);
}
} T2;
#undef lc
#undef rc
signed main()
{
// TEST("set3");
// freopen("a.in", "r", stdin);
// freopen("me.out", "w", stdout);
std::ios::sync_with_stdio(false); std::cin.tie(nullptr);
std::cin >> n >> q; for (int i = 1; i <= n; i++) std::cin >> a[i], pos[a[i]].eb(i);
for (int i = 1; i <= q; i++)
{
int l, r; std::cin >> l >> r;
Q[i] = {l, -r, i};
}
std::sort(Q + 1, Q + q + 1); for (int i = 1; i <= q; i++) Q[i][1] = -Q[i][1];
// for (int i = 1; i <= q; i++) printf("%d : %d ~ %d = %d\n", i, Q[i][0], Q[i][1], Q[i][2]);
T1.build(); T2.build(); int R = 0;
for (int i = 1; i <= q; i++) if (Q[i][1] > R) vis[i] = 1, T1.change(i, Q[i]), R = Q[i][1];
for (int i = 1; i <= q; i++) if (!vis[i]) T2.change(i, Q[i][1]);
// for (int i = 1; i <= q; i++) printf("%d : %d\n", i, vis[i]); puts("");
for (int t = M; t >= 0; t--)
{
// std::cerr << t << std::endl;
for (auto p : pos[t])
{
add(p, 1);
// debug
Ptn<int, int> range = {T1.qryL(p), T1.qryR(p)};
// debug
// std::cerr << range.fi << ' ' << range.se << std::endl;
if (range.fi == -1 || range.se == -1 || Q[range.fi][0] > p || Q[range.se][1] < p) continue;
// std::cerr << range.fi << ' ' << range.se << std::endl; debug
// printf("%d %d\n", t, p);
// printf("%d ~ %d\n", range.fi, range.se);
T1.modify(range.fi, range.se, -1);
// debug
}
while (T1.mx[1].fi >= t)
{
// printf("mx : %d %d\n", T1.mx[1].fi, T1.mx[1].se);
int id = T1.mx[1].se;
T1.del(id);
int nxtid = T1.nxt(id), prer = T1.pre(id);
// printf("%d id1 : %d %d\n", t, id, Q[id][2]);
// printf("[] %d %d\n", nxtid, prer);
ans[Q[id][2]] = t;
do
{
auto ng = T2.qry(id, nxtid);
// printf("id = %d nxtid = %d prer = %d %d %d\n", id, nxtid, prer, ng.fi, ng.se);
if (ng.fi > prer)
{
int F = Q[ng.se][1] - Q[ng.se][0] + 1 - (qry(Q[ng.se][1]) - qry(Q[ng.se][0] - 1));
// printf("t = %d : %d [][][] %d : %d\n", t, ng.se, Q[ng.se][2], F);
T1.change(ng.se, Q[ng.se], F); T2.del(ng.se);
nxtid = ng.se;
// printf("id2 : %d %d\n", ng.se, Q[ng.se][2]);
} else nxtid = -1;
} while (nxtid != -1);
}
}
for (int i = 1; i <= q; i++) printf("%d\n", ans[i]);
std::cerr << "Time = " << (double)clock() / CLOCKS_PER_SEC << "s" << std::endl;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 57356kb
input:
3 3 0 0 2 1 3 2 3 3 3
output:
3 1 0
result:
ok 3 number(s): "3 1 0"
Test #2:
score: 0
Accepted
time: 4ms
memory: 55204kb
input:
3 2 1 2 2 1 2 1 3
output:
0 3
result:
ok 2 number(s): "0 3"
Test #3:
score: 0
Accepted
time: 4ms
memory: 55304kb
input:
10 10 3 0 3 3 9 7 9 6 0 7 3 3 9 9 4 6 1 9 3 4 2 4 7 10 3 7 5 7 2 7
output:
0 1 0 5 0 1 1 0 0 1
result:
ok 10 numbers
Test #4:
score: 0
Accepted
time: 0ms
memory: 55200kb
input:
10 10 3 0 0 0 5 1 1 1 2 1 1 2 8 8 5 7 1 7 2 2 1 5 5 6 4 6 3 10 6 8
output:
1 0 2 7 1 4 0 2 8 3
result:
ok 10 numbers
Test #5:
score: 0
Accepted
time: 11ms
memory: 51776kb
input:
100 100 15 82 7 39 63 55 64 99 71 63 32 99 67 94 3 43 15 75 45 55 53 4 35 36 15 40 82 20 62 43 6 83 27 95 27 45 98 44 35 98 39 7 17 32 76 7 40 16 40 63 13 8 22 27 11 12 61 14 19 45 100 97 90 88 22 59 25 63 4 25 65 16 22 92 84 44 99 66 89 26 93 97 35 97 92 1 32 40 97 97 78 43 7 12 23 53 61 74 33 90 1...
output:
68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 100 numbers
Test #6:
score: 0
Accepted
time: 3ms
memory: 63496kb
input:
100 100 17 86 33 8 11 27 8 11 13 9 3 43 11 23 26 42 44 12 44 12 15 0 75 51 72 5 49 2 40 57 24 47 39 42 4 5 6 52 3 2 42 19 62 33 24 22 16 69 4 33 44 70 29 11 2 2 58 9 6 10 25 10 33 26 17 3 14 0 48 7 48 51 0 39 54 37 14 9 3 85 18 4 25 9 2 0 39 8 17 13 25 45 10 39 12 18 9 5 66 6 13 89 10 90 42 67 43 52...
output:
76 80 0 0 18 1 18 1 5 5 1 1 22 11 0 15 0 59 5 56 1 80 0 1 1 21 0 61 22 11 0 3 8 15 40 1 8 81 71 20 2 0 60 0 60 31 0 59 0 0 0 28 0 21 1 7 5 0 31 0 76 28 0 0 27 1 23 0 1 27 1 0 0 1 0 5 63 52 2 43 73 1 86 0 61 0 27 2 30 5 31 1 0 14 59 27 1 1 67 63
result:
ok 100 numbers
Test #7:
score: -100
Wrong Answer
time: 4ms
memory: 61336kb
input:
100 100 6 1 1 5 13 11 35 5 3 2 0 4 0 9 1 2 3 3 19 1 7 9 7 11 7 8 10 18 28 17 31 2 4 8 2 3 3 2 22 4 9 4 7 2 9 15 8 2 3 19 5 24 3 10 11 5 9 20 8 4 11 10 18 9 13 34 5 34 2 9 24 6 21 16 6 12 26 2 2 2 6 11 2 14 3 8 2 12 2 19 8 3 18 23 5 21 23 8 4 0 44 67 25 74 24 79 59 73 4 81 42 66 48 55 15 38 35 63 16 ...
output:
22 50 56 0 78 23 0 22 29 24 38 37 17 57 0 6 0 58 52 4 64 44 0 37 75 75 34 89 3 4 0 12 39 0 0 69 53 14 38 13 36 30 0 7 46 83 28 6 44 22 40 50 24 26 36 49 0 0 6 49 27 78 0 37 11 49 16 50 25 30 37 58 64 28 62 36 0 52 0 95 34 4 50 17 0 27 44 0 0 21 44 66 69 0 39 25 0 2 63 0
result:
wrong answer 29th numbers differ - expected: '0', found: '3'