显示原始代码
#include <bits/stdc++.h>
#define DB double
#define LL long long
#define MST(a, b) memset((a), (b), sizeof(a))
#define MRK() cout << "Mark" << endl;
#define WRT(x) cout << #x << " = " << (x) << endl;
#define MAXN 210000
#define MAXM 410000
#define MOD 998244353
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define EPS 1e-5
#define _ 0
using namespace std;
int X[MAXN], Y[MAXN];
int x[MAXN], y[MAXN];
int n;
int id[MAXN];
bool cmpx(int a, int b) { return x[a] < x[b]; }
bool cmpy(int a, int b) { return y[a] < y[b]; }
LL xtot, ytot;
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d%d", &X[i], &Y[i]);
x[i] = X[i] + Y[i];
y[i] = X[i] - Y[i];
xtot += x[i];
ytot += y[i];
id[i] = i;
}
if (n & 1) {
int ans = -1;
LL ansv = LLINF;
for (int i = 0; i < n; i++)
if (abs((LL)x[i] * n - xtot) + abs((LL)y[i] * n - ytot) < ansv) {
ansv = abs((LL)x[i] * n - xtot) + abs((LL)y[i] * n - ytot);
ans = i;
}
x[ans] = INF;
}
sort(id, id + n, cmpx);
if (n & 1)
n ^= 1;
int mid = n >> 1;
sort(id, id + mid, cmpy);
sort(id + mid, id + n, cmpy);
cout << n / 2 << endl;
for (int i = 0; i < mid; i++) cout << id[i] + 1 << ' ' << id[n - i - 1] + 1 << endl;
return ~~(0 ^ _ ^ 0);
}