水个blog
A~D 水题!
E
为啥就我用了650^2的方法
代码:
#include <bits/stdc++.h>
using namespace std;
int n, s1[500005], s2[500005];
int a[1005][1005], f1[1005][1005], f2[1005][1005];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &s1[i], &s2[i]);
a[s1[i]][s2[i]]++;
}
for (int i = 0; i <= 650; i++) {
for (int j = 0; j <= 650; j++) {
if (i > 0 && j > 0)
f1[i][j] += a[i - 1][j - 1] - f1[i - 1][j - 1];
if (i > 0)
f1[i][j] += f1[i - 1][j];
if (j > 0)
f1[i][j] += f1[i][j - 1];
}
}
for (int i = 650; i >= 0; i--) {
for (int j = 650; j >= 0; j--) {
f2[i][j] += a[i + 1][j + 1] - f2[i + 1][j + 1];
f2[i][j] += f2[i][j + 1];
f2[i][j] += f2[i + 1][j];
}
}
for (int i = 1; i <= n; i++) {
printf("%d %d\n", 1 + f2[s1[i]][s2[i]],
n - f1[s1[i]][s2[i]] - a[0][s2[i]] * (s1[i] == 650) - a[s1[i]][0] * (s2[i] == 650));
}
}