显示原始代码
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define REP(i, n) for (int i = 1; i <= (n); i++)
#define mp make_pair
#define pb push_back
#define fst first
#define snd second
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 100005;
int n;
int x[maxn], y[maxn], id_x[maxn], id_y[maxn];
pii all_x[maxn], all_y[maxn];
ll sum_x[maxn], sum_y[maxn];
vector<int> way[4];
int main() {
scanf("%d", &n);
rep(i, n) {
int xx, yy;
scanf("%d%d", &xx, &yy);
x[i] = xx + yy;
y[i] = xx - yy;
all_x[i] = mp(x[i], i);
all_y[i] = mp(y[i], i);
}
sort(all_x, all_x + n);
sort(all_y, all_y + n);
rep(i, n) {
sum_x[i] = (!i ? 0 : sum_x[i - 1]) + all_x[i].fst;
sum_y[i] = (!i ? 0 : sum_y[i - 1]) + all_y[i].fst;
id_x[all_x[i].snd] = i;
id_y[all_y[i].snd] = i;
}
ll ans = -1, ans_p = -1;
if (n & 1) {
rep(i, n) {
ll cur_x = sum_x[n / 2 - 1];
if (id_x[i] < n / 2)
cur_x = sum_x[n / 2] - x[i];
ll cur_y = sum_y[n / 2 - 1];
if (id_y[i] < n / 2)
cur_y = sum_y[n / 2] - y[i];
ll cur = sum_x[n - 1] - x[i] - 2 * cur_x + sum_y[n - 1] - 2 * cur_y - y[i];
if (cur > ans)
ans = cur, ans_p = i;
}
}
int lim_x = n / 2 - 1, lim_y = n / 2 - 1;
if (ans_p >= 0) {
if (id_x[ans_p] < n / 2)
lim_x++;
if (id_y[ans_p] < n / 2)
lim_y++;
}
rep(i, n) if (i != ans_p) {
int tp_x = (id_x[i] <= lim_x);
int tp_y = (id_y[i] <= lim_y);
way[tp_x << 1 | tp_y].pb(i);
}
printf("%d\n", n / 2);
rep(i, int(way[0].size())) printf("%d %d\n", way[0][i] + 1, way[3][i] + 1);
rep(i, int(way[1].size())) printf("%d %d\n", way[1][i] + 1, way[2][i] + 1);
return 0;
}