第三届ACM山东省赛I题_Chess_STL

7600B的代码量,不说啥了,现场能不能做出来还要看运气.

2Y,第一次忘记输出t16,WA了。。。

代码如下:

#include <cstdio>

#include <map>

#include <cstring>

#include <vector>

#include <algorithm>

using namespace std;

struct point

{

    int x,y;

    bool operator<(const point&c) const

    {

        if (x!=c.x)

            return x<c.x;

        return y<c.y;

    }

};

struct Information

{

    int x,y;

    char role;

};

struct mark

{

    int p,id;

    bool operator<(const mark &c) const

    {

        return p<c.p;

    }

};

Information information[100005];

map<point,int>ID;

map<int,vector<mark> >row,col,k1,k2;

int _count[100005],cnt_ID,horse[100005],cnt_horse,ans[20];

int dx[8]= {-2,-2,-1,-1,1,1,2,2},dy[8]= {1,-1,2,-2,2,-2,1,-1};

int main()

{

    int i,j,T,n;

    scanf("%d",&T);

    for (int kcase=1; kcase<=T; ++kcase)

    {

        scanf("%d",&n);

        memset(_count,0,sizeof(_count[0])*n);

        ID.clear();

        row.clear();

        col.clear();

        k1.clear();

        k2.clear();

        cnt_horse=cnt_ID=0;

        char c,ch;

        point p;

        mark m;

        int x,y;

        for (i=0; i<n; ++i)

        {

            scanf("%d %d %c%c",&information[i].x,&information[i].y,&information[i].role,&ch);

            x=p.x=information[i].x,p.y=y=information[i].y,c=information[i].role;

            if (c=='N')

                horse[cnt_horse++]=i;

            ID[p]=i;

            if (!row.count(x))

                row[x]=vector<mark>();

            if (!col.count(y))

                col[y]=vector<mark>();

            if (!k1.count(x+y))

                k1[x+y]=vector<mark>();

            if (!k2.count(x-y))

                k2[x-y]=vector<mark>();

            m.id=i,m.p=y;

            row[x].push_back(m);

            m.p=x;

            col[y].push_back(m);

            k1[x+y].push_back(m);

            k2[x-y].push_back(m);

        }

        for (map<int,vector<mark> >::iterator it=row.begin(); it!=row.end(); it++)

            sort(row[it->first].begin(),row[it->first].end());

        for (map<int,vector<mark> >::iterator it=col.begin(); it!=col.end(); it++)

            sort(col[it->first].begin(),col[it->first].end());

        for (map<int,vector<mark> >::iterator it=k1.begin(); it!=k1.end(); it++)

            sort(k1[it->first].begin(),k1[it->first].end());

        for (map<int,vector<mark> >::iterator it=k2.begin(); it!=k2.end(); it++)

            sort(k2[it->first].begin(),k2[it->first].end());

//        printf("row :\n");

//        for (map<int,vector<mark> >::iterator it=row.begin(); it!=row.end(); it++)

//        {

//            printf("%d :    ",it->first);

//            for (i=0; i<row[it->first].size(); ++i)

//                printf(" %d",row[it->first][i].id);

//            printf("\n");

//        }

//        for (map<int,vector<mark> >::iterator it=col.begin(); it!=col.end(); it++)

//            sort(col[it->first].begin(),col[it->first].end());

//        for (map<int,vector<mark> >::iterator it=k1.begin(); it!=k1.end(); it++)

//            sort(k1[it->first].begin(),k1[it->first].end());

//        for (map<int,vector<mark> >::iterator it=k2.begin(); it!=k2.end(); it++)

//            sort(k2[it->first].begin(),k2[it->first].end());

        for (map<int,vector<mark> >::iterator it=row.begin(); it!=row.end(); it++)

        {

            int size=row[it->first].size();

            for (i=0; i<size; ++i)

            {

                if (information[row[it->first][i].id].role=='K')

                {

                    if (i && row[it->first][i-1].p==row[it->first][i].p-1)

                        ++_count[row[it->first][i-1].id];

                    if (i<size-1 && row[it->first][i+1].p==row[it->first][i].p+1)

                        ++_count[row[it->first][i+1].id];

                }

                else if (information[row[it->first][i].id].role=='R' || information[row[it->first][i].id].role=='Q')

                {

                    if (i)

                        ++_count[row[it->first][i-1].id];

                    if (i<size-1)

                        ++_count[row[it->first][i+1].id];

                }

            }

        }

        for (map<int,vector<mark> >::iterator it=col.begin(); it!=col.end(); it++)

        {

            int size=col[it->first].size();

            for (i=0; i<size; ++i)

            {

                if (information[col[it->first][i].id].role=='K')

                {

                    if (i && col[it->first][i-1].p==col[it->first][i].p-1)

                        ++_count[col[it->first][i-1].id];

                    if (i<size-1 && col[it->first][i+1].p==col[it->first][i].p+1)

                        ++_count[col[it->first][i+1].id];

                }

                else if (information[col[it->first][i].id].role=='R' || information[col[it->first][i].id].role=='Q')

                {

                    if (i)

                        ++_count[col[it->first][i-1].id];

                    if (i<size-1)

                        ++_count[col[it->first][i+1].id];

                }

            }

        }

        for (map<int,vector<mark> >::iterator it=k1.begin(); it!=k1.end(); it++)

        {

            int size=k1[it->first].size();

            for (i=0; i<size; ++i)

            {

                if (information[k1[it->first][i].id].role=='K')

                {

                    if (i && k1[it->first][i-1].p==k1[it->first][i].p-1)

                        ++_count[k1[it->first][i-1].id];

                    if (i<size-1 && k1[it->first][i+1].p==k1[it->first][i].p+1)

                        ++_count[k1[it->first][i+1].id];

                }

                else if (information[k1[it->first][i].id].role=='B' || information[k1[it->first][i].id].role=='Q')

                {

                    if (i)

                        ++_count[k1[it->first][i-1].id];

                    if (i<size-1)

                        ++_count[k1[it->first][i+1].id];

                }

            }

        }

        for (map<int,vector<mark> >::iterator it=k2.begin(); it!=k2.end(); it++)

        {

            int size=k2[it->first].size();

            for (i=0; i<size; ++i)

            {

                if (information[k2[it->first][i].id].role=='K')

                {

                    if (i && k2[it->first][i-1].p==k2[it->first][i].p-1)

                        ++_count[k2[it->first][i-1].id];

                    if (i<size-1 && k2[it->first][i+1].p==k2[it->first][i].p+1)

                        ++_count[k2[it->first][i+1].id];

                }

                else if (information[k2[it->first][i].id].role=='B' || information[k2[it->first][i].id].role=='Q')

                {

                    if (i)

                        ++_count[k2[it->first][i-1].id];

                    if (i<size-1)

                        ++_count[k2[it->first][i+1].id];

                }

            }

        }

        for (i=0; i<cnt_horse; ++i)

            for (j=0; j<8; ++j)

            {

                p.x=information[horse[i]].x+dx[j];

                p.y=information[horse[i]].y+dy[j];

                if (ID.count(p))

                    ++_count[ID[p]];

            }

        memset(ans,0,sizeof(ans));

        for (i=0; i<n; ++i)

            ++ans[_count[i]];

//        for (i=0; i<n; ++i)

//            printf("%d ",_count[i]);

//        printf("\n");

        printf("Case %d:\n",kcase);

        printf("%d",ans[0]);

        for (i=1; i<=16; ++i)

            printf(" %d",ans[i]);

        printf("\n");

    }

    return 0;

}

  

你可能感兴趣的:(ACM)