链接:
https://www.nowcoder.com/acm/contest/70/F
来源:牛客网
来源:牛客网
题目描述
在一个n*n的国际象棋棋盘上有m个皇后。
一个皇后可以攻击其他八个方向的皇后(上、下、左、右、左上、右上、左下、右下)。
对于某个皇后,如果某一个方向上有其他皇后,那么这个方向对她就是不安全的。
对于每个皇后,我们都能知道她在几个方向上是不安全的。
现在我们想要求出t 0,t 1,...,t 8,其中t i表示恰有i个方向是"不安全的"的皇后有多少个。
一个皇后可以攻击其他八个方向的皇后(上、下、左、右、左上、右上、左下、右下)。
对于某个皇后,如果某一个方向上有其他皇后,那么这个方向对她就是不安全的。
对于每个皇后,我们都能知道她在几个方向上是不安全的。
现在我们想要求出t 0,t 1,...,t 8,其中t i表示恰有i个方向是"不安全的"的皇后有多少个。
输入描述:
第一行两个整数n,m表示棋盘大小和皇后数量。 接下来m行每行两个整数ri,ci表示皇后坐标。 1 <= n, m <= 100,000 1 <= ri, ci <= n 数据保证没有皇后在同一个位置上。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100007;
int t[10];
struct node
{
int x,y;
int num;
int l,r,p,q;
}c[maxn];
bool cmp1(const node& a,const node& b)
{
if(a.l!=b.l)return a.l<b.l;
return a.r<b.r;
}
bool cmp2(const node& a,const node& b)
{
if(a.r!=b.r)return a.r<b.r;
else return a.l<b.l;
}
bool cmp3(const node& a,const node& b)
{
if(a.p!=b.p)return a.p<b.p;
return a.q<b.q;
}
bool cmp4(const node& a,const node& b)
{
if(a.q!=b.q)return a.q<b.q;
return a.p<b.p;
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&c[i].x,&c[i].y);
c[i].l=c[i].x;
c[i].r=c[i].y;
c[i].p=c[i].x-c[i].y;
c[i].q=c[i].x+c[i].y;
c[i].num=0;
}
memset(t,0,sizeof(t));
sort(c,c+m,cmp1);
for(int i=1;i<m;i++)
{
if(c[i].l==c[i-1].l)
{
c[i].num++;c[i-1].num++;
}
}
sort(c,c+m,cmp2);
for(int i=1;i<m;i++)
{
if(c[i].r==c[i-1].r)
{
c[i].num++;c[i-1].num++;
}
}
sort(c,c+m,cmp3);
for(int i=1;i<m;i++)
{
if(c[i].p==c[i-1].p)
{
c[i].num++;c[i-1].num++;
}
}
sort(c,c+m,cmp4);
for(int i=1;i<m;i++)
{
if(c[i].q==c[i-1].q)
{
c[i].num++;c[i-1].num++;
}
}
for(int i=0;i<m;i++) t[c[i].num]++;
for(int i=0;i<8;i++)
printf("%d ",t[i]);
printf("%d\n",t[8]);
return 0;
}