洛谷 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;
}