洛谷 P1105 平台

先排了一波顺序,按高度减序号增,这样就不用每次都从头开始找到尾,满足左端在下方的范围内即是左答案,右边同理,然后再按序号排一波顺序,回到答案要求的输出顺序输出即可。题解O(N^2)算法也可以解决,反而让我这种排来排去显得复杂了。。。

AcCode:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
struct tai{
	int h, l, r, id;
	int ansl, ansr;
};

tai a[1010];

bool Cmp(const tai &a, const tai &b){
	if(a.h != b.h) return a.h > b.h;
	else return a.id < b.id;
}

bool Cmp1(const tai &a, const tai &b){
	return a.id < b.id;
}

int main(){
    int T;
    cin >> T;
    a[0] = {0, -1, 3e4, 0}; //底部平台
    for(int i = 1; i <= T; i++){
    	int h, l, r;
    	cin >> h >> l >> r;
    	a[i] = {h, l, r, i};
	}
	sort(a, a + T + 1, Cmp);
	for(int i = 0; i <= T; i++){
		int idx = i + 1;
		while(idx < T + 1){
			if(a[i].h != a[idx].h){
				if(a[idx].r > a[i].l && a[idx].l < a[i].l){
					a[i].ansl = a[idx].id;
					break;
				} 
				
			}
			idx++;
		}
		idx = i + 1;
		while(idx < T + 1){
			if(a[i].h != a[idx].h){
				if(a[idx].l < a[i].r && a[idx].r > a[i].r){
					a[i].ansr = a[idx].id;
					break;
				} 
			}
			idx++;
		}
	}
	sort(a, a + T + 1, Cmp1);
	for(int i = 1; i <= T; i++) cout << a[i].ansl << " " << a[i].ansr << endl;
    return 0;
}
posted @ 2025-05-27 00:10  Yuhhhhh  阅读(74)  评论(0)    收藏  举报