第三届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;
}

浙公网安备 33010602011771号