过不了样例三天了求条,悬 2 关
查看原帖
过不了样例三天了求条,悬 2 关
773915
endswitch楼主2024/3/21 21:55
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, q, x, y, z, op;
const int N = 5e4 + 5;
struct Segment_Tree {
	#define mid (L + R) >> 1
	#define lson ls(p), L, (L + R) >> 1
	#define rson rs(p), ((L + R) >> 1) + 1, R
	#define son p, L, R
	int ans[N << 2], len[N << 2], tag[N << 2], lmax[N << 2], rmax[N << 2];
	inline int ls(int p) {return p << 1;}
	inline int rs(int p) {return p << 1 | 1;}
	inline void psup(int  p) {
		if(ans[ls(p)] == len[ls(p)]) lmax[p] = ans[ls(p)] + lmax[rs(p)];
		else lmax[p] = lmax[ls(p)];
		if(ans[rs(p)] == len[rs(p)]) rmax[p] = ans[rs(p)] + rmax[ls(p)];
		else rmax[p] = rmax[rs(p)];
		ans[p] = max({ans[ls(p)], ans[rs(p)], lmax[rs(p)] + rmax[ls(p)]});
	}
	inline void build(int p = 1, int L = 1, int R = n) {
		ans[p] = len[p] = lmax[p] = rmax[p] = R - L + 1;
		if(L == R) return;
		build(lson), build(rson), psup(p);
	}
	inline void work1(int p) {
		tag[p] = 1;
		ans[p] = lmax[p] = rmax[p] = 0;
	}
	inline void work2(int p) {
		tag[p] = 2;
		ans[p] = lmax[p] = rmax[p] = len[p];
	}
	inline void psd(int p, int L, int R) {
		if(! tag[p]) return;
		else if(tag[p] == 1) work1(ls(p)), work1(rs(p));
		else work2(ls(p)), work2(rs(p));
		tag[p] = 0;
	}
	inline void add(int l, int r, int k, int p = 1, int L = 1, int R = n) {
		if(l <= L && R <= r) {
			if(k == 1) work1(p);
			else work2(p);
			return;
		}
		psd(son);
		if(l <= mid) add(l, r, k, lson);
		if(r > mid) add(l, r, k, rson);
		psup(p);
	}        
	inline int query(int k, int p = 1, int L = 1, int R = n) {
		if(L == R) return L;
		psd(son);
		if(ans[ls(p)] >= k) return query(k, lson);
		else if(rmax[ls(p)] + lmax[rs(p)] >= k) return mid - rmax[ls(p)] + 1;
		else return query(k, rson);
	}
} Sgt;
signed main() {
	ios_base :: sync_with_stdio(NULL);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> n >> q;
	Sgt.build();
	while(q --) {
		cin >> op >> x;
		if(op == 1) {
			if(Sgt.ans[1] < x) {
				cout << "0\n";
				continue;
			}
			z = Sgt.query(x), Sgt.add(z, z + x - 1, 1), cout << z << '\n' << Sgt.ans[1] << '\n';
		}
		else cin >> y, Sgt.add(x, x + y - 1, 2);
	}
	return 0;
}
2024/3/21 21:55
加载中...