E. Correct Placement
题意
你有n个朋友,每个朋友具有(h_i,w_i)两个属性,让你在满足条件下,求第i个朋友是否具有能放在其前面的朋友,输出对应的id
思路
因为h,w可以交换,所以我们将所有的h,w中大的作为y,小的作为x,然后按一定的规则排序。
排序后我们用双指针去寻找在i前面的最小的
朋友,然后将其放到i的前面即可。注意要时刻更新最小值。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 100;
#define int long long
typedef long long LL;
struct NODE {
int a, b, id;
bool operator < (const NODE& x) const {
if (a != x.a) return a < x.a;
return b < x.b;
}
}a[N];
int ans[N];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; ++i) {
int x, y; cin >> x >> y;
if (x > y)swap(x,y);
a[i] = {x, y, i};
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; ++i)ans[i] = -1;
int j = 1, v = 1e9, id = -1;
for (int i = 1; i <= n; ++i) {
while (j < i && a[j].a < a[i].a) {
if (v > a[j].b) {
v = a[j].b;
id = a[j].id;
}
++j;
}
if (v < a[i].b)ans[a[i].id] = id;
}
for (int i = 1; i <= n; ++i) {
cout << ans[i] << " ";
}
cout << endl;
}
signed main() {
int T = 1;
// scanf("%d",&T);
cin >> T;
while (T--) {
solve();
}
}