QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#428485 | #964. Excluded Min | Estelle_N | WA | 5ms | 24408kb | C++14 | 5.2kb | 2024-06-01 19:47:51 | 2024-06-01 19:47:52 |
Judging History
answer
#include <set>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 500005;
int n, m, a[N], c[N], ans[N];
vector <int> p[N];
struct Query
{
int l, r, id;
};
Query q[N];
struct SegmentTree
{
struct Node
{
int Max, pos;
};
struct Tree
{
int l, r, Max, pos, add;
};
Tree s[N << 2];
#define ls p << 1
#define rs p << 1 | 1
void build(int p, int l, int r)
{
s[p].l = l;
s[p].r = r;
s[p].pos = l;
if(l == r)
return;
int mid = l + r >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
}
void push_down(int p)
{
s[ls].add += s[p].add;
s[ls].Max += s[p].add;
s[rs].add += s[p].add;
s[rs].Max += s[p].add;
s[p].add = 0;
}
void push_up(int p)
{
s[p].Max = max(s[ls].Max, s[rs].Max);
if(s[ls].Max >= s[rs].Max)
s[p].pos = s[ls].pos;
else
s[p].pos = s[rs].pos;
}
void Add(int p, int l, int r, int k)
{
if(s[p].l >= l && s[p].r <= r)
{
s[p].add += k;
s[p].Max += k;
return;
}
push_down(p);
int mid = s[p].l + s[p].r >> 1;
if(l <= mid)
Add(ls, l, r, k);
if(r > mid)
Add(rs, l, r, k);
push_up(p);
}
void Upd(int p, int x, int k)
{
if(s[p].l == s[p].r)
{
s[p].Max = k;
return;
}
push_down(p);
int mid = s[p].l + s[p].r >> 1;
if(x <= mid)
Upd(ls, x, k);
else
Upd(rs, x, k);
push_up(p);
}
Node maxNode(Node x, Node y)
{
if(x.Max >= y.Max)
return x;
return y;
}
Node Get(int p, int l, int r)
{
if(s[p].l >= l && s[p].r <= r)
return (Node){s[p].Max, s[p].pos};
push_down(p);
int mid = s[p].l + s[p].r >> 1;
if(r <= mid)
return Get(ls, l, r);
if(l > mid)
return Get(rs, l, r);
return maxNode(Get(ls, l, r), Get(rs, l, r));
}
};
SegmentTree S, T;
set < pair<int, int> > lpos, rpos;
void add(int x, int k)
{
for(; x <= n; x += x & -x)
c[x] += k;
}
int get(int x)
{
int r = 0;
for(; x; x -= x & -x)
r += c[x];
return r;
}
int main()
{
// freopen("S.in", "r", stdin);
// freopen("A.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i)
scanf("%d", &a[i]), p[a[i]].push_back(i), add(i, 1);
for(int i = 1; i <= m; ++ i)
scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;
sort(q + 1, q + 1 + m, [](Query i, Query j)
{ return i.l == j.l ? i.r > j.r : i.l < j.l;});
T.build(1, 1, m);
S.build(1, 1, m);
for(int i = 1, R = 0; i <= m; ++ i)
{
if(q[i].l == q[i - 1].l || q[i].r <= R)
{
S.Upd(1, i, q[i].r);
T.Upd(1, i, -1e9);
}
else
{
R = q[i].r;
T.Upd(1, i, q[i].r - q[i].l + 1);
lpos.insert(make_pair(q[i].l, i));
rpos.insert(make_pair(q[i].r, i));
}
}
for(int i = n; i >= 0; -- i)
{
for(int u : p[i])
{
add(u, -1);
auto itl = lpos.upper_bound(make_pair(u, N));
auto itr = rpos.lower_bound(make_pair(u, 0));
// printf("{%d, %d}, {%d, %d}\n", itl -> first, itl -> second, itr -> first, itr -> second);
if(itl != lpos.begin() && itr != rpos.end() && prev(itl) -> second >= itr -> second)
T.Add(1, itr -> second, prev(itl) -> second, -1);
}
while(T.s[1].Max >= i)
{
int u = T.s[1].pos, r, R;
ans[q[u].id] = i;
lpos.erase(make_pair(q[u].l, u));
rpos.erase(make_pair(q[u].r, u));
if(lpos.size() == 0)
{
r = m;
R = 0;
}
else
{
auto itr = lpos.upper_bound(make_pair(q[u].l, u));
r = (itr == lpos.end() ? m : itr -> second);
R = (itr == lpos.begin() ? 0 : prev(itr) -> first);
if(itr == lpos.end() && prev(itr) -> second == u)
R = 0;
}
if(u + 1 <= r)
{
SegmentTree::Node x = S.Get(1, u + 1, r);
while(u + 1 <= r && x.Max > 0 && q[x.pos].r > R)
{
r = x.pos - 1;
lpos.insert(make_pair(q[x.pos].l, x.pos));
rpos.insert(make_pair(q[x.pos].r, x.pos));
S.Upd(1, x.pos, 0);
T.Upd(1, x.pos, get(q[x.pos].r) - get(q[x.pos].l - 1));
if(u + 1 <= r)
x = S.Get(1, u + 1, r);
}
}
T.Upd(1, u, -1e9);
}
}
for(int i = 1; i <= m; ++ i)
printf("%d\n", ans[i]);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 5ms
memory: 24348kb
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: 5ms
memory: 24408kb
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: 0ms
memory: 22384kb
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: 3ms
memory: 24296kb
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: -100
Wrong Answer
time: 3ms
memory: 22408kb
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 19 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 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 19 0 0 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0
result:
wrong answer 28th numbers differ - expected: '0', found: '19'