QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#574991 | #964. Excluded Min | zhaohaikun | WA | 0ms | 20136kb | C++23 | 3.9kb | 2024-09-19 09:39:12 | 2024-09-19 09:39:13 |
Judging History
answer
// MagicDark
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define ls num << 1
#define rs ls | 1
#define li ls, l, mid
#define ri rs, mid + 1, r
#define debug cerr << "\33[32m[" << __LINE__ << "]\33[m "
#define SZ(x) ((int) x.size() - 1)
#define all(x) x.begin(), x.end()
#define ms(x, y) memset(x, y, sizeof x)
#define F(i, x, y) for (int i = (x); i <= (y); i++)
#define DF(i, x, y) for (int i = (x); i >= (y); i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template <typename T> T& chkmax(T& x, T y) {return x = max(x, y);}
template <typename T> T& chkmin(T& x, T y) {return x = min(x, y);}
template <typename T> T& read(T &x) {
x = 0; int f = 1; char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = - f;
for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x *= f;
}
const int N = 5e5 + 10, inf = 1e9;
int n, q, a[N], ans[N], l[N], r[N], id[N];
vector <int> v[N], vv[N];
int info[N << 2], mx[N << 2], tag[N << 2];
set <pair <int, int>> s1, s2;
void pushup1(int num) {
info[num] = max(info[ls], info[rs]);
}
void pushup2(int num) {
mx[num] = max(mx[ls], mx[rs]);
}
void build(int num, int l, int r) {
mx[num] = - inf;
if (l == r) {
info[num] = v[l].size() ? ::r[v[l].back()] : 0;
return;
}
build(li), build(ri);
pushup1(num);
}
struct BIT {
int t[N];
void add(int x, int y) {
for (; x <= n; x += x & - x) t[x] += y;
}
int query(int x) {
int s = 0;
for (; x; x ^= x & - x) s += t[x];
return s;
}
int query(int l, int r) {
return query(r) - query(l - 1);
}
} bt;
int pos;
void down(int num, int x) {
tag[num] += x;
mx[num] += x;
}
void pushdown(int num) {
if (tag[num]) down(ls, tag[num]), down(rs, tag[num]), tag[num] = 0;
}
void change(int num, int l, int r, int L, int R, int x) {
if (L <= l && r <= R) return down(num, x);
pushdown(num);
if (mid >= L) change(li, L, R, x);
if (mid < R) change(ri, L, R, x);
pushup2(num);
}
void ins(int l, int r) {
// debug << "! " << l << " " << r << endl;
s1.emplace(l, r);
s2.emplace(r, l);
}
void bot(int num, int l, int r, int L, int R) {
if (info[num] <= pos) return;
if (l == r) {
pos = info[num];
mx[num] = bt.query(l, info[num]);
id[l] = v[l].back();
// debug << "@ " << l << " " << info[num] << endl;
ins(l, info[num]);
// s1.emplace(l, info[num]);
// s2.emplace(info[num], l);
v[l].pop_back();
info[num] = v[l].size() ? ::r[v[l].back()] : 0;
return;
}
if (mid >= L) bot(li, L, R);
if (mid < R) bot(ri, L, R);
pushup2(num);
}
vector <int> gg;
void del(int l, int r) {
// debug << "! " << l << " " << r << endl;
gg.push_back(l);
assert(s1.erase(make_pair(l, r)));
assert(s2.erase(make_pair(r, l)));
}
void qq(int num, int l, int r, int o) {
if (mx[num] < o) return;
if (l == r) {
del(l, ::r[id[l]]);
mx[num] = - inf;
ans[id[l]] = o;
return;
}
pushdown(num);
qq(li, o), qq(ri, o);
pushup2(num);
}
signed main() {
read(n), read(q);
F(i, 1, n) vv[read(a[i])].push_back(i), bt.add(i, 1);
F(i, 1, q) {
read(l[i]), read(r[i]);
// debug << "@ " << l[i] << " " << r[i] << endl;
v[l[i]].push_back(i);
}
F(i, 1, n) sort(all(v[i]), [&] (int x, int y) {
return r[x] < r[y];
});
// debug << v[2].size() << endl;
ins(0, 0), ins(n + 1, n + 1);
build(1, 1, n);
bot(1, 1, n, 1, n);
DF(i, n, 0) {
for (int j: vv[i]) {
bt.add(j, - 1);
auto it = s2.lower_bound(make_pair(j, 0));
int p = it -> second;
if (p <= j) change(1, 1, n, p, j, - 1);
}
while (true) {
gg.clear();
qq(1, 1, n, i);
if (gg.empty()) break;
for (int j: gg) {
auto i2 = s1.lower_bound(make_pair(j, inf));
auto i1 = prev(i2);
// if (j < i2 -> first) {
pos = i1 -> second;
bot(1, 1, n, j, i2 -> first - 1);
// }
}
}
}
F(i, 1, q) cout << ans[i] << '\n';
return 0;
}
/* why?
*/
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 18000kb
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: 0ms
memory: 20136kb
input:
3 2 1 2 2 1 2 1 3
output:
0 3
result:
ok 2 number(s): "0 3"
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 19976kb
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 0 0 5 0 1 1 0 0 1
result:
wrong answer 2nd numbers differ - expected: '1', found: '0'