P2894简单的线段树问题求助!!!
查看原帖
P2894简单的线段树问题求助!!!
372454
AsadChen楼主2022/7/24 00:37

连样例都过不了QAQ 我太菜了

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 5e4 + 10;
struct Node {
	int l, r, sum, len, lmax, rmax, tag;
	//区间最大连续空房数,区间长,
	//最大前缀长,最大后缀长 
}tr[N * 4];
int n, m;

//tag:1为开房,2为退房 

void push_up(int u) {
	//求tr[u].lmax 
	if (tr[u << 1].sum == tr[u << 1].len) {
		tr[u].lmax = tr[u << 1].sum + tr[u << 1 | 1].lmax;
	} else {
		tr[u].lmax = tr[u << 1].lmax;
	}
	
	//求tr[u].rmax
	if (tr[u << 1 | 1].sum == tr[u << 1 | 1].len) {
		tr[u].rmax = tr[u << 1 | 1].sum + tr[u << 1].rmax;
	} else {
		tr[u].rmax = tr[u << 1 | 1].rmax;
	}
	
	//求tr[u].sum
	tr[u].sum = max(max(tr[u << 1].sum, tr[u << 1 | 1].sum), tr[u << 1].rmax + tr[u << 1 | 1].lmax); 
}

void push_down(int u) {
	if (tr[u].tag == 0) {
		return;
	}
	if (tr[u].tag == 1) {
		tr[u << 1].tag = tr[u << 1 | 1].tag = 1;
		tr[u << 1].sum = tr[u << 1].lmax = tr[u << 1].rmax = 0;
		tr[u << 1 | 1].sum = tr[u << 1 | 1].lmax = tr[u << 1 | 1].rmax = 0;
	}
	if (tr[u].tag == 2) {
		tr[u << 1].tag = tr[u << 1 | 1].tag = 2;
		tr[u << 1].sum = tr[u << 1].lmax = tr[u << 1].rmax = tr[u << 1].len;
		tr[u << 1 | 1].sum = tr[u << 1 | 1].lmax = tr[u << 1 | 1].rmax = tr[u << 1 | 1].len;
	}
	tr[u].tag = 0; //懒标记清零 
}

void build(int u, int l, int r) {
	if (l == r) {
		int len = r - l + 1;
	    tr[u] = {l, r, len, len, len, len, 0};
		//return;
	} else {
	    int mid = l + r >> 1;
	    build(u << 1, l, mid);
	    build(u << 1 | 1, mid + 1, r);
	    push_up(u); 
    }
}

//int l, r, sum, len, lmax, rmax, tag
void modify(int u, int tag, int l, int r,int L, int R) {
	push_down(u);
	if (L >= l && R <= r) {
		if (tag == 1) {
			//开房,区间作无效
			tr[u].lmax = tr[u].rmax = tr[u].sum = 0;
		} else {
			//退房,区间作等长 
			tr[u].lmax = tr[u].rmax = tr[u].sum = tr[u].len;
		}
		tr[u].tag = tag; 
		return;
	}
	int mid = L + R >> 1;
	if (l <= mid) modify(u << 1, tag, l, r, L, mid);
	if (r > mid) modify(u << 1 | 1, tag, l, r, mid + 1, R);
	push_up(u);
}
//int l, r, sum, len, lmax, rmax, tag;

int query(int u, int l, int r, int x) {
	push_down(u);
	if (l == r) {
		return l;
	}
	int mid = l + r >> 1;
	if (tr[u << 1].sum >= x) {
		return query(u << 1, l, mid, x);
	} else if (tr[u << 1].rmax + tr[u << 1 | 1].lmax >= x) {
		return mid - tr[u << 1].rmax + 1;
	} else {
		return query(u << 1 | 1, mid + 1, r, x);
	} 
}

int main() {
	scanf("%d%d", &n, &m);
	build(1, 1, n);
	
	int op, x, y;
	while (m--) {
		scanf("%d", &op);
		if (op == 1) {
			scanf("%d", &x);
			if (tr[1].sum >= x) {
				int L = query(1, 1, n, x);
				printf("%d\n", L);
				modify(1, 1, L, L + x - 1, 1, n);
			} else {
				printf("0\n");
			}
		} else {
			scanf("%d%d", &x, &y);
			modify(1, 2, x, x + y - 1, 1, n);
		}
	}
	return 0;
}
2022/7/24 00:37
加载中...