Codeforces Beta Round #95 (Div. 2) E. Yet Another Task with Queens(模拟)

来源:互联网 发布:传智播客java课程 编辑:程序博客网 时间:2024/05/22 01:30

题目地址:http://codeforces.com/problemset/problem/131/E

思路:行i,列j,对角线一 i+j,对角线二 i-j 。使用set(有序),若当前皇后对应项(行列对角线)在set一端且元素个数不为1,则该皇后在该项被1皇后攻击。若在set元素中间,则该皇后在该项被2皇后攻击。

#include<set>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=1e5+50;struct Node{    int x,y;    Node(int a=0,int b=0):x(a),y(b) {}    bool operator < (const Node & rhs) const    {        return rhs.y<y;    }    bool operator !=(const Node & rhs) const    {        return rhs.y!=y;    }    bool operator ==(const Node & rhs) const    {        return rhs.y==y;    }};int n,m;int ans[10];Node P[maxn];set<Node> A[maxn],B[maxn];set<Node> C[2*maxn],D[3*maxn];int solve(const set<Node> & tmp,Node x){    set<Node>::iterator it1;    set<Node>::iterator it2;    it1=tmp.begin(),it2=tmp.end(),it2--;    if((x==(*it1)||x==(*it2))&&(*it1!=*it2)) return 1;    if(x!=(*it1)&&x!=(*it2)) return 2;    return 0;}int main(){    scanf("%d%d",&n,&m);    for(int i=0; i<m; i++)    {        int x,y;        scanf("%d%d",&x,&y);        P[i].x=x,P[i].y=y;        A[x].insert(Node(x,y));        B[y].insert(Node(y,x));        C[x+y].insert(Node(x+y,x-y+2*n));        D[x-y+2*n].insert(Node(x-y+2*n,x+y));    }    for(int i=0; i<m; i++)    {        int r=P[i].x,c=P[i].y,sum=0;        sum+=solve(C[r+c],Node(r+c,r-c+2*n));        sum+=solve(D[r-c+2*n],Node(r-c+2*n,r+c));        sum+=solve(A[r],Node(r,c))+solve(B[c],Node(c,r));        ans[sum]++;    }    for(int i=0; i<8; i++)        printf("%d ",ans[i]);    printf("%d\n",ans[8]);    return 0;}


0 0