UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#197483#2719. 8.2t4tkswls1002952ms31968kbC++114.0kb2023-11-12 11:47:252023-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