QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#478920 | #6509. Not Another Range Query Problem | pavement | WA | 19ms | 5856kb | C++17 | 2.1kb | 2024-07-15 12:54:23 | 2024-07-15 12:54:25 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
int n, q, del_time[500005];
char s[500005];
set<int> rem;
struct dat {
int a{-1}, b{-1}, diff{(int)1e9};
};
dat combine(dat lhs, dat rhs) {
dat ret;
ret.diff = min(lhs.diff, rhs.diff);
if (lhs.b != -1 && rhs.a != -1 && s[lhs.b] != s[rhs.a]) {
ret.diff = min(ret.diff, rhs.a);
}
if (lhs.a == -1) {
ret.a = rhs.a;
} else {
ret.a = lhs.a;
}
if (rhs.b == -1) {
ret.b = lhs.b;
} else {
ret.b = rhs.b;
}
return ret;
}
struct node {
node *left, *right;
int S, E;
dat val;
node(int _s, int _e) : S(_s), E(_e) {
if (S == E) {
val.a = val.b = S;
return;
}
int M = (S + E) / 2;
left = new node(S, M);
right = new node(M + 1, E);
val = combine(left->val, right->val);
}
dat qry(int l, int r) {
if (l > E || r < S) {
dat dummy;
return dummy;
}
if (l <= S && E <= r) {
return val;
}
return combine(left->qry(l, r), right->qry(l, r));
}
void del(int p) {
if (S == E) {
val.a = val.b = -1;
val.diff = (int)1e9;
return;
}
int M = (S + E) / 2;
if (p <= M) {
left->del(p);
} else {
right->del(p);
}
val = combine(left->val, right->val);
}
} *root;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> s[i];
}
root = new node(1, n);
//~ for (int i = 1, l, r, k; i <= q; i++) {
//~ cin >> l >> r >> k;
//~ }
for (int i = 1; i <= n; i++) {
rem.insert(i);
}
for (int t = 1; !rem.empty(); t++) {
vector<int> to_erase;
for (int st = *rem.begin(); st <= n; st = root->qry(st, n).diff) {
to_erase.pb(st);
}
for (auto i : to_erase) {
rem.erase(i);
root->del(i);
del_time[i] = t;
}
}
for (int i = 1, l, r, k; i <= q; i++) {
cin >> l >> r >> k;
int cur = 0;
for (int j = l, prv = 0; j <= r; j++) {
int tmp = min(del_time[j], prv + 1);
prv = max(del_time[j], prv + 1);
if (tmp > k) {
cur++;
}
}
cout << cur << '\n';
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 5856kb
input:
9 7 100110001 2 5 1 3 6 1 4 8 2 2 7 1 1 9 1 1 9 0 1 9 8
output:
2 1 1 3 4 9 0
result:
ok 7 numbers
Test #2:
score: -100
Wrong Answer
time: 19ms
memory: 3672kb
input:
100 100000 0000011010101000111011110110000111110101101010111111101011011010111001111010111000001000011000001010 76 99 3 25 84 7 45 83 11 10 12 10 69 86 4 27 28 1 22 42 42 4 86 25 26 91 22 20 81 17 50 78 0 77 93 50 31 50 34 7 46 13 78 89 0 79 98 0 2 84 33 58 93 11 56 75 2 55 77 68 7 9 41 44 46 11 47 ...
output:
9 16 12 0 5 0 0 0 1 6 29 0 0 0 12 20 0 7 6 0 0 0 0 2 0 0 0 13 18 1 0 57 0 0 11 0 5 0 0 3 0 0 0 0 0 0 0 0 1 0 0 8 0 0 19 0 0 0 14 12 0 0 3 0 3 0 1 10 13 0 0 0 6 0 8 2 1 16 0 19 29 40 21 12 26 0 21 6 2 10 19 7 5 2 2 6 0 0 9 0 1 0 51 0 0 0 20 11 0 21 6 9 13 0 16 22 3 21 4 26 0 0 0 0 0 0 11 46 59 2 9 43...
result:
wrong answer 1st numbers differ - expected: '8', found: '9'