显示原始代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll point[100010][2];
int n, i;
ll xmax, xmin, ymax, ymin;
ll dx, dy;
vector<int> vecx;
vector<int> vecy;
bool cmpx(int x, int y) { return point[x][0] < point[y][0]; }
bool cmpy(int x, int y) { return point[x][1] < point[y][1]; }
int main() {
scanf("%d", &n);
printf("%d\n", n / 2);
for (i = 1; i <= n; i++) {
scanf("%lld %lld", &point[i][0], &point[i][1]);
}
for (i = 1; i <= n; i++) {
vecx.push_back(i);
vecy.push_back(i);
}
sort(vecx.begin(), vecx.end(), cmpx);
sort(vecy.begin(), vecy.end(), cmpy);
while (n > 1) {
int l = vecx.size();
int xfro = vecx.front();
int xend = vecx.back();
int yfro = vecy.front();
int yend = vecy.back();
xmin = point[xfro][0];
xmax = point[xend][0];
ymin = point[yfro][1];
ymax = point[yend][1];
dx = xmax - xmin;
dy = ymax - ymin;
if (dx > dy) {
printf("%d %d\n", xfro, xend);
vecx.pop_back();
vecx.erase(vecx.begin());
int flag = 0;
for (int i = 0; i < vecy.size(); i++) {
if (vecy[i] == xfro || vecy[i] == xend) {
vecy.erase(vecy.begin() + i);
flag++;
i--;
if (flag == 2) {
break;
}
}
}
continue;
}
if (dy > dx) {
printf("%d %d\n", yfro, yend);
vecy.pop_back();
vecy.erase(vecy.begin());
int flag = 0;
for (int i = 0; i < vecx.size(); i++) {
if (vecx[i] == yfro || vecx[i] == yend) {
vecx.erase(vecx.begin() + i);
flag++;
i--;
if (flag == 2) {
break;
}
}
}
continue;
}
if (dx == dy) {
if (vecx[l - 2] - vecx[1] >= vecy[l - 1] - vecy[0]) {
printf("%d %d\n", xfro, xend);
vecx.pop_back();
vecx.erase(vecx.begin());
int flag = 0;
for (int i = 0; i < vecy.size(); i++) {
if (vecy[i] == xfro || vecy[i] == xend) {
vecy.erase(vecy.begin() + i);
flag++;
i--;
if (flag == 2) {
break;
}
}
}
continue;
} else {
printf("%d %d\n", yfro, yend);
vecy.pop_back();
vecy.erase(vecy.begin());
int flag = 0;
for (int i = 0; i < vecx.size(); i++) {
if (vecx[i] == yfro || vecx[i] == yend) {
vecx.erase(vecx.begin() + i);
flag++;
i--;
if (flag == 2) {
break;
}
}
}
}
}
n -= 2;
}
return 0;
}