ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#197483 | #2719. 8.2t4 | tkswls | 100 | 2952ms | 31968kb | C++11 | 4.0kb | 2023-11-12 11:47:25 | 2023-11-12 12:27:53 |
answer
#include<bits/stdc++.h>
using namespace std;
int n, m;
struct node {
int l, r, maxa, maxb, taga, tagb, changetag;
} b[1600005];
inline void update(int p) {
if (b[2 * p].maxa >= b[2 * p + 1].maxa) {
b[p].maxa = b[2 * p].maxa;
b[p].maxb = b[2 * p].maxb;
} else {
b[p].maxa = b[2 * p + 1].maxa;
b[p].maxb = b[2 * p + 1].maxb;
}
}
inline void push_down(int p) {
if (b[p].taga == 1) { // 左
b[2 * p].taga = b[2 * p + 1].taga = b[p].taga;
b[2 * p].tagb = b[2 * p + 1].tagb = b[p].tagb;
b[2 * p].maxa = b[2 * p].r - b[p].tagb;
b[2 * p + 1].maxa = b[2 * p + 1].r - b[p].tagb;
b[2 * p].maxb = b[2 * p].r ;
b[2 * p + 1].maxb = b[2 * p + 1].r ;
b[p].taga = b[p].tagb = 0;
} else if (b[p].taga == 2) { // R
b[2 * p].taga = b[2 * p + 1].taga = b[p].taga;
b[2 * p].tagb = b[2 * p + 1].tagb = b[p].tagb;
b[2 * p].maxa = b[p].tagb - b[2 * p].l;
b[2 * p + 1].maxa = b[p].tagb - b[2 * p + 1].l;
b[2 * p].maxb = b[2 * p].l ;
b[2 * p + 1].maxb = b[2 * p + 1].l ;
b[p].taga = b[p].tagb = 0;
}
if (b[p].changetag) {
b[p].changetag = 0;
b[2 * p].maxa = b[2 * p + 1].maxa = 0;
b[2 * p + 1].maxb = b[2 * p + 1].l;
b[2 * p].maxb = b[2 * p].l;
b[2 * p].changetag = b[2 * p + 1].changetag = 1;
b[2 * p].taga = b[2 * p].tagb = b[2 * p + 1].taga = b[2 * p + 1].tagb = 0;
return;
}
}
inline void change(int p, int l, int r, int taga, int tagb) {
// cout << l << "|" << r << "|" << taga << " " << tagb << " " << b[p].l << ";" << b[p].r << endl;
if (l > r) return;
if (b[p].l >= l && b[p].r <= r) {
push_down(p);
if (taga == 1) {
b[p].maxa = b[p].r - tagb;
b[p].maxb = b[p].r;
} else {
b[p].maxa = tagb - b[p].l;
b[p].maxb = b[p].l;
}
b[p].taga = taga;
b[p].tagb = tagb;
return;
}
push_down(p);
int mid = (b[p].l + b[p].r) >> 1;
if (r <= mid) change(2 * p, l, r, taga, tagb);
else if (l > mid) change(2 * p + 1, l, r, taga, tagb);
else {
change(2 * p, l, mid, taga, tagb);
change(2 * p + 1, mid + 1, r, taga, tagb);
}
update(p);
// cout << b[p].maxa << ' ' << b[p].maxb << " " << b[p].l << " " << b[p].r << "\n";
}
inline void build(int p, int l, int r) {
b[p].l = l;
b[p].r = r;
b[p].taga = b[p].tagb = 0;
if (l == r) {
b[p].maxb = l;
b[p].maxa = 0;
return;
}
build(2 * p, l, (l + r) >> 1);
build(2 * p + 1, ((l + r) >> 1) + 1, r);
update(p);
}
int t[200005];
inline int lowbit(int p) {
return p & -p;
}
inline void add(int p, int q) {
while (p <= n) {
t[p] += q;
p += lowbit(p);
}
}
inline int query(int p) {
int cnt = 0;
while (p >= 1) {
cnt += t[p];
p -= lowbit(p);
}
return cnt;
}
inline int findl(int p) {
if (query(p - 1) == 0) return -1;
int l = 1, r = p - 1, mid;
while (l < r) {
mid = (l + r + 1) >> 1;
if (query(p - 1) - query(mid - 1)) l = mid;
else r = mid - 1;
}
return l;
}
inline int findr(int p) {
if (query(n) - query(p) == 0) return -1;
int l = p + 1, r = n, mid;
while (l < r) {
mid = (l + r) >> 1;
if (query(mid) - query(p)) r = mid;
else l = mid + 1;
}
return l;
}
inline void solve(int p, int q) {
// cout << p << "===" << q << endl;
if (p == -1 && q == -1) {
push_down(1);
b[1].changetag = 1;
b[1].maxa = 0;
b[1].maxb = 1;
return;
}
if (p == -1) {
change(1, 1, q, 2, q);
} else if (q == -1) {
change(1, p, n, 1, p);
} else {
int mid = (p + q) >> 1;
if (mid - p > q - mid) {
change(1, p, mid - 1, 1, p);
change(1, mid, q, 2, q);
} else {
change(1, p, mid, 1, p);
change(1, mid + 1, q, 2, q);
}
}
}
int tab[200005];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
build(1, 1, n);
int p, q;
for (int i = 1; i <= m; i++) {
cin >> p >> q;
if (p == 1) {
cout << b[1].maxb << "\n";
tab[q] = b[1].maxb;
q = b[1].maxb;
add(q, 1);
solve(findl(q), q);
solve(q, findr(q));
} else {
add(tab[q], -1);
solve(findl(tab[q]), findr(tab[q]));
tab[q] = 0;
}
}
}
Details
小提示:点击横条可展开更详细的信息
Test #1:
score: 10
Accepted
time: 0ms
memory: 1296kb
input:
99 98 1 1 1 2 1 3 2 1 1 4 1 5 2 2 1 6 1 7 2 3 1 8 2 5 1 9 1 10 2 7 1 11 1 12 1 13 1 14 1 15 1 16 1 1...
output:
1 99 50 1 25 99 74 49 25 13 74 37 61 86 7 19 31 43 55 67 80 92 80 4 10 73 16 1 99 22 28 61 73 34 40 ...
result:
ok 73 numbers
Test #2:
score: 10
Accepted
time: 1ms
memory: 1300kb
input:
91 97 1 1 2 1 1 2 1 3 1 4 1 5 1 6 2 2 1 7 1 8 1 9 1 10 2 5 1 11 1 12 1 13 2 3 1 14 2 9 1 15 1 16 1 1...
output:
1 1 91 46 23 68 1 12 34 57 23 79 40 91 31 85 6 68 48 17 62 73 27 55 35 44 9 20 51 58 65 85 76 82 88 ...
result:
ok 75 numbers
Test #3:
score: 10
Accepted
time: 176ms
memory: 16840kb
input:
97371 96780 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 ...
output:
1 97371 48686 24343 73028 12172 36514 60857 85199 42600 91285 6086 18257 30428 54771 66942 79113 912...
result:
ok 96780 numbers
Test #4:
score: 10
Accepted
time: 381ms
memory: 31968kb
input:
200000 200000 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 ...
output:
1 200000 100000 150000 50000 75000 125000 175000 25000 37500 62500 87500 112500 137500 162500 187500...
result:
ok 200000 numbers
Test #5:
score: 10
Accepted
time: 487ms
memory: 31712kb
input:
199920 199946 1 1 1 2 1 3 2 1 1 4 1 5 1 6 1 7 2 2 1 8 1 9 1 10 2 3 1 11 1 12 2 4 1 13 2 5 1 14 1 15 ...
output:
1 199920 99960 1 149940 49980 74970 199920 124950 174930 99960 24990 1 149940 37485 62475 87465 1999...
result:
ok 133386 numbers
Test #6:
score: 10
Accepted
time: 508ms
memory: 31712kb
input:
199987 199900 1 1 2 1 1 2 1 3 1 4 1 5 1 6 2 2 1 7 1 8 1 9 1 10 2 3 2 4 1 11 1 12 1 13 1 14 1 15 2 5 ...
output:
1 1 199987 99994 49997 149990 1 24999 74995 124992 199987 99993 174988 12500 37498 149990 56246 1999...
result:
ok 132837 numbers
Test #7:
score: 10
Accepted
time: 494ms
memory: 31712kb
input:
199922 199928 1 1 1 2 1 3 2 1 2 2 2 3 1 4 1 5 1 6 1 7 1 8 2 4 1 9 2 5 1 10 1 11 1 12 1 13 1 14 2 6 1...
output:
1 199922 99961 1 199922 99961 49981 149941 1 199922 24991 74971 124951 174931 99961 49981 149941 124...
result:
ok 133525 numbers
Test #8:
score: 10
Accepted
time: 220ms
memory: 16736kb
input:
100000 100000 1 1 1 2 2 1 2 2 1 3 2 3 1 4 1 5 1 6 2 4 1 7 1 8 1 9 1 10 2 5 1 11 2 6 1 12 1 13 1 14 2...
output:
1 100000 1 1 100000 50000 1 75000 25000 37500 100000 56250 87500 12500 71875 1 46875 64062 29687 382...
result:
ok 66679 numbers
Test #9:
score: 10
Accepted
time: 223ms
memory: 16736kb
input:
100000 100000 1 1 1 2 2 1 1 3 1 4 2 2 1 5 2 3 1 6 2 4 1 7 1 8 1 9 2 5 1 10 2 6 1 11 1 12 1 13 2 7 1 ...
output:
1 100000 1 50000 100000 1 50000 75000 25000 100000 1 37500 62500 50000 81250 12500 25000 71875 90625...
result:
ok 66630 numbers
Test #10:
score: 10
Accepted
time: 462ms
memory: 31712kb
input:
200000 199999 1 1 1 2 1 3 2 1 1 4 2 2 2 3 1 5 1 6 1 7 1 8 1 9 2 4 1 10 2 5 1 11 2 6 1 12 1 13 1 14 2...
output:
1 200000 100000 1 200000 100000 150000 50000 75000 1 200000 112500 175000 25000 143750 93750 128125 ...
result:
ok 133546 numbers