社区讨论

17pts,求调

P2894[USACO08FEB] Hotel G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mits8cxb
此快照首次捕获于
2025/12/06 12:17
3 个月前
此快照最后确认于
2025/12/06 15:57
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct node {
	int lsum, rsum, sum, len;
} tree[400005];
int tag[400005];
node operator+(node a, node b) {
	int lsum = 0, rsum = 0, sum = 0, len = a.len + b.len;
	lsum = a.lsum;
	rsum = b.rsum;
	sum = max({a.sum, b.sum, a.rsum + b.lsum});
	if (a.lsum == a.len) {
		lsum = a.len + b.lsum;
	}
	if (b.rsum == b.len) {
		rsum = b.len + a.rsum;
	}
	return {lsum, rsum, sum, len};
}
int n, m;
void build(int id, int l, int r) {
	if (l == r) {
		tree[id] = {1, 1, 1, 1};
		return ;
	}
	int mid = (l + r) >> 1;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
void push(int id, int l, int r) {
	if (tag[id] != -1) {
		if(tag[id]==0){
			tree[id*2]={0,0,0,tree[id*2].len};
			tree[id*2+1]={0,0,0,tree[id*2+1].len};
			tag[id*2]=tag[id];
			tag[id*2+1]=tag[id];
		}else{
			tree[id*2]={tree[id*2].len,tree[id*2].len,tree[id*2].len,tree[id*2].len};
			tree[id*2+1]={tree[id*2+1].len,tree[id*2+1].len,tree[id*2+1].len,tree[id*2+1].len};
			tag[id*2]=tag[id];
			tag[id*2+1]=tag[id];
		}
		tag[id] = -1;
	}
}
void up(int id, int l, int r, int ql, int qr, int val) {
	if (ql <= l && r <= qr) {
		tree[id] = {(r - l + 1)*val, (r - l + 1)*val, (r - l + 1)*val, tree[id].len};
		tag[id] = val;
		return ;
	}
	push(id, l, r);
	int mid = (l + r) >> 1;
	if (ql <= mid)up(id * 2, l, mid, ql, qr, val);
	if (qr > mid)up(id * 2 + 1, mid + 1, r, ql, qr, val);
	tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
int query(int id, int l, int r, int x) {
	if (l == r) {
		return l;
	}
	push(id, l, r);
	int mid = (l + r) >> 1;
	if (tree[id * 2].sum >= x) {
		return query(id * 2, l, mid, x);
	} else if (tree[id * 2].rsum + tree[id * 2 + 1].lsum >= x) {
		return mid - tree[id * 2].rsum + 1;
	} else if (tree[id * 2 + 1].sum >= x) {
		return query(id * 2 + 1, mid + 1, r, x);
	}
	return 0;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	for (int i = 1; i <= 400000; i++) {
		tag[i] = -1;
	}
	cin >> n >> m;
	build(1, 1, n);
	while (m--) {
		int q, x, y;
		cin >> q >> x;
		if (q == 1) {
			int ans = query(1, 1, n, x);
			up(1, 1, n, ans, ans + x - 1, 0);
			cout << ans << "\n";
		} else {
			cin >> y;
			up(1, 1, n, x, x + y - 1, 1);
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...