2 3 4点wa,求数据
查看原帖
2 3 4点wa,求数据
938260
SHERLOCK0226楼主2023/9/2 15:37
#include<bits/stdc++.h>
#define MAXSIZE 10010
using namespace std;

typedef struct{
	int l, r;
	int max;
	int biao;
}BUILDING;

typedef struct{
	int l, r, h;
}B;

B b[MAXSIZE];
BUILDING building[4*MAXSIZE];

void build(int pos, int l, int r);
void down(int pos);
void change(int pos, int l, int r, int k);
int query(int pos, int l, int r);

int main(){
	int b0 = 0, l0 = 0, r0 = 0, h0 = 0, len = 0, a[MAXSIZE] = {0};
	while(scanf("%d %d %d", &l0, &h0, &r0) != EOF){
		b0++;
		b[b0].l = l0;
		b[b0].h = h0;
		b[b0].r = r0;
		len = max(len, r0);
	}
	build(1, 1, len);
	for(int i = 1; i <= b0; ++i){
		change(1, b[i].l, b[i].r-1, b[i].h);
	}
	
	for(int i = 1; i <= len; ++i){
		a[i] = query(1, i, i);
	}
	printf("1 %d ", a[1]);
	for(int i = 2; i <= len; ++i){
		if(a[i] != a[i-1]){
			printf("%d %d ", i, a[i]);
		}
	}	

	return 0;
}

void build(int pos, int l, int r){//左右闭区间,建树,初始化数据 
	building[pos].l = l;
	building[pos].r = r; 
	if(l == r)
	{
		building[pos].max = 0;
		building[pos].biao = 0;
		return;
	}
	
	int mid = (l + r) / 2;
	build(2 * pos, l, mid);
	build(2 * pos + 1, mid + 1, r);
}

void change(int pos, int l, int r, int k){
	//if(building[pos].l == l && building[pos].r == r){错的 
	if(l <= building[pos].l && building[pos].r <= r){
		if(building[pos].max < k){
			building[pos].max = k;
			building[pos].biao = k;
		}
		return;	//更新数据,递归 
	}
	
	if(building[pos].biao)//旧数据,递推 
		down(pos);
	
	int mid = (building[pos].l + building[pos].r) / 2;
//	if(r <= mid)	change(2*pos, l, r, k);
//	if(l > mid)		change(2*pos+1, l, r, k);
	if(l <= mid)	change(2*pos, l, r, k);//注意区别二分!!! 
	if(r > mid)		change(2*pos+1, l, r, k);
	building[pos].max = max(building[2*pos].max, building[2*pos+1].max);//结合递归,更新数据 
}
void down(int pos){
	if(building[2*pos].biao < building[pos].biao){
		building[2*pos].biao = building[pos].biao;
		building[2*pos].max = max(building[2*pos].max, building[2*pos].biao);
	}
	if(building[2*pos+1].biao < building[pos].biao){
		building[2*pos+1].biao = building[pos].biao;
		building[2*pos+1].max = max(building[2*pos+1].max, building[2*pos+1].biao);
	}
}

int query(int pos, int l, int r){
	if(l <= building[pos].l  && building[pos].r <= r){
		return building[pos].max;
	}
	
	if(building[pos].biao)//递推(下沉) 
		down(pos);
		
	int mid = (building[pos].l + building[pos].r) / 2, max0 = 0;
	if(l <= mid){
		//return query(2*pos, l, mid);  
		max0 = max(max0, query(2*pos, l, r));
	}
	if(r > mid){
		//return query(2*pos+1, mid+1, r);
		max0 = max(max0, query(2*pos+1, l, r)); 	
	}
	return max0;
}

2023/9/2 15:37
加载中...