P1904求助:使用线段树,但是样例炸了
查看原帖
P1904求助:使用线段树,但是样例炸了
317008
青溪白石楼主2022/10/22 11:19
#include<iostream>
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
using namespace std;
const int maxn = 10010;
struct Node{
	int l, r;
	int max, lazy;
}node[maxn * 4];
void build(int num, int l, int r){
	node[num].l = l; node[num].r = r;
	node[num].max = node[num].lazy = 0;
	if(l == r) return;
	int m = (l + r) >> 1;
	build(ls(num), l, m);
	build(rs(num), m + 1, r);
}
void add(int num, int l, int r, int v){
	node[num].max = max(node[num].max, v);
	if(l <= node[num].l && node[num].r <= r){
		node[num].lazy = max(node[num].lazy, v);
		return;
	}
	if(node[num].lazy){
		node[ls(num)].max = max(node[ls(num)].max, node[num].lazy);
		node[ls(num)].lazy = max(node[ls(num)].lazy, node[num].lazy);
		node[rs(num)].max = max(node[rs(num)].max, node[num].lazy);
		node[rs(num)].lazy = max(node[rs(num)].lazy, node[num].lazy);
		node[num].lazy = 0;
	}
	if(l <= node[ls(num)].r) add(ls(num), l, r, v);
	if(r >= node[rs(num)].l) add(rs(num), l, r, v);
}
int query(int num, int a){
	if(node[num].l == node[num].r) return node[num].max;
	node[ls(num)].max = max(node[ls(num)].max, node[num].lazy);
	node[rs(num)].max = max(node[rs(num)].max, node[num].lazy);
	node[num].lazy = 0;
	int ans = 0;
	if(a <= node[ls(num)].r) ans = max(ans, query(ls(num), a));
	if(a >= node[rs(num)].l) ans = max(ans, query(rs(num), a));
	return ans;
}
int main(){
	build(1, 1, 16384);
	int a, b, c;
	int _l = 16384, _r = 0;
	while(cin >> a >> b >> c){
		if(a == -1) break;//为了方便调试(输入-1可直接终止输入。 
		add(1, a, c, b);
		_l = min(_l, a);
		_r = max(_r, c);
	}
	int y = query(1, _l);
	cout << _l << " " << y << " ";
	for(int i = _l + 1; i <= _r + 1; i++){
		int temp = query(1, i);
		if(temp != y){
			y = temp;
			cout << i << " " << y << " ";
		}
	}
	//cout << n << " " << y;
}
2022/10/22 11:19
加载中...