思路:
先只考虑左右方向,那么其实我们只要把所有皇后按 r 为第一关键字,c 为第二关键
字排序后,扫一遍就知道每个皇后左右受敌的情况。
同理可求竖直方向。
对于对角线的方向,一条对角线是按 r+c 为第一关键字,r 为第二关键字排序;
另一条对角线是按 r-c 为第一关键字,r 为第二关键字排序。
#include<bits/stdc++.h>
#define debug(a) cout << #a << " " << a << endl
#define LL long long
#define ull unsigned long long
#define PI acos(-1.0)
#define eps 1e-6
const int N=1e5+7;
using namespace std;
struct node {
int x,y;
int id;
}p[N];
int sum[N];
int ans[N];
bool cmp1(node a,node b)
{
return a.x==b.x ? a.y<b.y : a.x<b.x;
}
bool cmp2(node a,node b)
{
return a.y==b.y ? a.x<b.x : a.y<b.y;
}
bool cmp3(node a,node b)
{
return a.y-a.x==b.y-b.x ? a.x<b.x : a.y-a.x<b.y-b.x;
}
bool cmp4(node a,node b)
{
return a.y+a.x==b.y+b.x ? a.x<b.x : a.y+a.x<b.y+b.x;
}
int main ()
{
//yyy_3y
//freopen("1.in","r",stdin);
int n,m; scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&p[i].x,&p[i].y);
p[i].id=i;
}
sort(p,p+m,cmp1);
for(int i=1;i<m;i++){
if(p[i].x==p[i-1].x) sum[p[i].id]++,sum[p[i-1].id]++;
}
sort(p,p+m,cmp2);
for(int i=1;i<m;i++){
if(p[i].y==p[i-1].y) sum[p[i].id]++,sum[p[i-1].id]++;
}
sort(p,p+m,cmp3);
for(int i=1;i<m;i++){
if(p[i].y-p[i].x==p[i-1].y-p[i-1].x) sum[p[i].id]++,sum[p[i-1].id]++;
}
sort(p,p+m,cmp4);
for(int i=1;i<m;i++){
if(p[i].y+p[i].x==p[i-1].y+p[i-1].x) sum[p[i].id]++,sum[p[i-1].id]++;
}
for(int i=0;i<m;i++)
ans[sum[i]]++;
for(int i=0;i<=8;i++)
printf("%d%c",ans[i],i==8 ? '\n' : ' ');
return 0;
}