20pts,为啥同样代码提交三次,WA的都不一样啊
查看原帖
20pts,为啥同样代码提交三次,WA的都不一样啊
678858
ShiRoZeTsuHL卜奎BBQ!楼主2023/2/6 19:00

1 2 3

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e5 + 5;

#define ls (id << 1)
#define rs (id << 1 | 1)
#define mid ((l + r) >> 1)

int n, m;

struct node {
	int iss, le, ri, hh, len, tag;
} t[maxn<<2];

node comb(node a, node b) {
	node res;
	res.iss = a.iss + b.iss;
	res.le = !a.iss ? a.len + b.le : a.le;
	res.ri = !b.iss ? b.len + a.ri : b.ri;
	res.hh = max(a.hh, b.hh);
	res.hh = max(res.hh, a.ri + b.le);
	res.len = a.len + b.len;
	return res;
}

void pushdown(int id) {
	//tag1 represents all issues
	//tag2 represents all holes
	if(t[id].tag == 1) {
		t[ls].iss = t[ls].len, t[rs].iss = t[rs].len;
		t[ls].le = t[ls].ri = t[ls].hh = 0;
		t[rs].le = t[rs].ri = t[rs].hh = 0;
		t[ls].tag = t[rs].tag = 1;
		t[id].tag = 0;
	}
	else if(t[id].tag == 2) {
		t[ls].iss = t[rs].iss = 0;
		t[ls].le = t[ls].ri = t[ls].hh = t[ls].len;
		t[rs].le = t[rs].ri = t[rs].hh = t[rs].len;
		t[ls].tag = t[rs].tag = 2;
		t[id].tag = 0;
	}
}

void build(int l, int r, int id) {
	if(l == r) t[id].iss = t[id].len = 1;
	else {
		build(l, mid, ls), build(mid+1, r, rs);
		t[id].iss = t[id].len = r-l+1;
	}
}

void dig(int ql, int qr, int l, int r, int id) {
	if(ql <= l && r <= qr) {
		t[id].iss = 0;
		t[id].le = t[id].ri = t[id].hh = t[id].len;
		t[id].tag = 2;
		return;
	}
	if(t[id].tag) pushdown(id);
	if(ql <= mid) dig(ql, qr, l, mid, ls);
	if(mid < qr) dig(ql, qr, mid+1, r, rs);
	t[id] = comb(t[ls], t[rs]);
}

void heal(int ql, int qr, int l, int r, int id, int& k) {
	if(k <= 0) return;
	if(t[id].tag) pushdown(id);
	if(ql <= l && r <= qr) {
		if(t[id].iss == t[id].len) return;
		if(k >= t[id].len - t[id].iss) {
			k -= t[id].len - t[id].iss;
			t[id].iss = t[id].len;
			t[id].le = t[id].ri = t[id].hh = 0;
			t[id].tag = 1;
			return;
		}
		heal(ql, qr, l, mid, ls, k);
		t[id] = comb(t[ls], t[rs]);
		if(k <= 0) return;
		heal(ql, qr, mid+1, r, rs, k);
		t[id] = comb(t[ls], t[rs]);
		return;
	}
	if(ql <= mid) heal(ql, qr, l, mid, ls, k);
	t[id] = comb(t[ls], t[rs]);
	if(k <= 0) return;
	if(mid < qr) heal(ql, qr, mid+1, r, rs, k);
	t[id] = comb(t[ls], t[rs]);
}

int cnt(int ql, int qr, int l, int r, int id) {
	if(ql <= l && r <= qr) return t[id].iss;
	if(t[id].tag) pushdown(id);
	int res = 0;
	if(ql <= mid) res += cnt(ql, qr, l, mid, ls);
	if(mid < qr) res += cnt(ql, qr, mid+1, r, rs);
	return res;
}

node query(int ql, int qr, int l, int r, int id) {
	if(ql <= l && r <= qr) return t[id];
	if(t[id].tag) pushdown(id);
	if(qr <= mid) return query(ql, qr, l, mid, ls);
	if(mid < ql) return query(ql, qr, mid+1, r, rs);
	return comb(query(ql, qr, l, mid, ls), query(ql, qr, mid+1, r, rs));
}

int main() {
//	freopen("test.in", "r", stdin);
//	freopen("test.out", "w", stdout);
	scanf("%d %d", &n, &m);
	build(1, n, 1);
	for(int i = 1; i <= m; i++) {
		int op, l, r;
		scanf("%d %d %d", &op, &l, &r);
		if(op == 0) dig(l, r, 1, n, 1);
		else if(op == 2) printf("%d\n", query(l, r, 1, n, 1).hh);
		else {
			int hole = cnt(l, r, 1, n, 1);
			dig(l, r, 1, n, 1);
			scanf("%d %d", &l, &r);
			heal(l, r, 1, n, 1, hole);
		}
	}
	return 0;
}
2023/2/6 19:00
加载中...