显示原始代码
#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define pb push_back
#define pii pair<int, int>
#define fi first
#define se second
#define ri register int
#define rep(i, a, b) for (ri i = (a); i <= (b); ++i)
using namespace std;
inline int read() {
ri x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ '0'), c = getchar();
return x * f;
}
const int N = 1e6 + 5;
int n, a[N], b[N];
pii x[N], y[N];
ll xl, xr, xL, xR, yl, yr, yL, yR, ans;
vector<int> v[4];
int main() {
n = read();
rep(i, 1, n) {
ri xx = read(), yy = read();
x[i] = mp(xx + yy, i);
y[i] = mp(xx - yy, i);
}
sort(x + 1, x + n + 1);
sort(y + 1, y + n + 1);
rep(i, 1, n) a[x[i].se] = i, b[y[i].se] = i;
if (n & 1) {
n >>= 1;
ri p;
rep(i, 1, n + 1) xl += x[i].fi, yl += y[i].fi;
rep(i, n + 1, n << 1 | 1) xr += x[i].fi, yr += y[i].fi;
rep(i, 1, n << 1 | 1) {
if (a[i] <= n)
xL = xl - x[a[i]].fi, xR = xr - x[n + 1].fi;
else
xL = xl - x[n + 1].fi, xR = xr - x[a[i]].fi;
if (b[i] <= n)
yL = yl - y[b[i]].fi, yR = yr - y[n + 1].fi;
else
yL = yl - y[n + 1].fi, yR = yr - y[b[i]].fi;
if (xR + yR - xL - yL >= ans)
p = i, ans = xR + yR - xL - yL;
}
n <<= 1;
rep(i, a[p], n) x[i] = x[i + 1];
rep(i, b[p], n) y[i] = y[i + 1];
rep(i, 1, n) a[x[i].fi] = i, b[y[i].fi] = i;
}
n >>= 1;
rep(i, 1, n) if (b[x[i].se] <= n) v[0].pb(x[i].se);
else v[1].pb(x[i].se);
rep(i, n + 1, n << 1) if (b[x[i].se] <= n) v[2].pb(x[i].se);
else v[3].pb(x[i].se);
printf("%d\n", n);
ri sz = v[0].size() - 1;
rep(i, 0, sz) printf("%d %d\n", v[0][i], v[3][i]);
sz = v[1].size() - 1;
rep(i, 0, sz) printf("%d %d\n", v[1][i], v[2][i]);
return 0;
}