牛客练习赛13_F-m皇后(思维)

5 篇文章 0 订阅
4 篇文章 0 订阅

传送门

思路:
先只考虑左右方向,那么其实我们只要把所有皇后按 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值