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

传送门

思路:
先只考虑左右方向,那么其实我们只要把所有皇后按 r 为第一关键字,c 为第二关键
字排序后,扫一遍就知道每个皇后左右受敌的情况。
同理可求竖直方向。
对于对角线的方向,一条对角线是按 r+c 为第一关键字,r 为第二关键字排序;
另一条对角线是按 r-c 为第一关键字,r 为第二关键字排序。

#include
#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.y : a.x.x;
}
bool cmp2(node a,node b)
{
    return a.y==b.y ? a.x.x : a.y.y;
}
bool cmp3(node a,node b)
{
    return a.y-a.x==b.y-b.x ? a.x.x : a.y-a.x.y-b.x;
}
bool cmp4(node a,node b)
{
    return a.y+a.x==b.y+b.x ? a.x.x : a.y+a.x.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
        scanf("%d%d",&p[i].x,&p[i].y);
        p[i].id=i;
    }
    sort(p,p+m,cmp1);
    for(int i=1;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
        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
        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
        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
        ans[sum[i]]++;
    for(int i=0;i<=8;i++)
        printf("%d%c",ans[i],i==8 ? '\n' : ' ');
    return 0;
}


你可能感兴趣的:(思维,模拟,wannafly)