ODT求调
查看原帖
ODT求调
729386
_Fancy_楼主2024/8/24 16:08

#11和hack TLE

代码

#include <bits/stdc++.h>
using namespace std;
#define IT set<node>::iterator
int n, op, m, ans;
long long l, r;
struct node {
	long long l, r;
	mutable bool v;
	node(long long L, long long R = -1, bool V = 0):l(L), r(R), v(V) {}
	bool operator< (const node &T) const {
		return l < T.l;
	}
} ;
set<node> s;
IT split(long long pos) {
	IT it = s.lower_bound(pos);
	if(it != s.end() && it -> l == pos) return it;
	--it;
	long long l = it -> l, r = it -> r;
	bool v = it -> v;
	s.erase(it);
	s.insert(node(l, pos - 1, v));
	return s.insert(node(pos, r, v)).first;
}
void assign(long long l, long long r, int val) {
	IT itr = split(r + 1), itl = split(l);
	s.erase(itl, itr);
	s.insert(node(l, r, val));
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	s.insert(node(1, n, 0));
	while(m--) {
		cin >> op >> l;
		if(op == 2) {
			cin >> r;
			assign(l, l + r - 1, 0);
		} else {
			IT itr = split(n + 1), itl = split(1);
			int sum = 0, st = 1, fl = 0;
			for(IT it = itl; it != itr; it++) {
				if(it -> v == 0) sum += (it -> r) - (it -> l) + 1;
				else {
					if(sum >= l) {
						assign(st, st + l - 1, 1), fl = st;
						break;
					} else {
						st = (it -> r) + 1, sum = 0;
					}
				}
			}
			if(sum >= l && !fl) assign(st, st + l - 1, 1), fl = st;
			cout << fl << endl;
		}
	}
	return 0;
}

2024/8/24 16:08
加载中...