比赛 2024国庆练习2 评测结果 AAAAAAAAAWWWWAAAAWWW
题目名称 战棋 最终得分 65
用户昵称 123 运行时间 0.135 s
代码语言 C++ 内存使用 3.39 MiB
提交时间 2024-10-05 18:18:06
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int xx,aa,bb,cc,n,len1,len2,o=500,tot[N][11],q[N][11],q1=0,q2=0,ret1=0,ret2=0;
struct node {
	int ll,rr,flag;
} a[N][11],b[N][11];
int get() {
	return xx=(xx*aa+bb)%cc;
}
void pushup(int now,int e)
{
	if (b[now][e].flag<5)
	{
		b[now][e].ll+=20*(q[2][e]+q[7][e])-20*(b[now][e].flag==2 || b[now][e].flag==7);
	} 
	else
	{
		b[now][e].ll+=20*(q[4][e]+q[9][e])-20*(b[now][e].flag==4 || b[now][e].flag==9);
		b[now][e].rr+=20*(q[4][e]+q[9][e])-20*(b[now][e].flag==4 || b[now][e].flag==9);
	}
}
void push(int nowa,int nowb)
{
	b[nowa][1].rr-=b[nowb][2].ll;
	b[nowb][2].rr-=b[nowa][1].ll;
	if (b[nowa][1].rr<=0)
	{
		q1=nowa;
		for (int i=0;i<n;i++)
		{
			if (tot[i][1]==nowa)
			{
				for (int j=i;j<n;j++)
				{
					tot[j][1]=tot[j+1][1];
				}
				break;
			}
		}
		q[b[nowa][1].flag][1]--;
		len1--;
	}
	if (b[nowb][2].rr<=0)
	{
		q2=nowb;
		for (int i=0;i<n;i++)
		{
			if (tot[i][2]==nowb)
			{
				for (int j=i;j<n;j++)
				{
					tot[j][2]=tot[j+1][2];
				}
				break;
			}
		}
		q[b[nowb][2].flag][2]--;
		len2--;
	}
}
void pushdown(int now,int e)
{
	if (b[now][e].flag==3 || b[now][e].flag==8)
	{
		for (int i=0;i<n;i++)
		{
			if (b[i][e].flag<6)
			{
				b[i][e].ll+=20;
				b[i][e].rr+=20;
			}
		}
	}
	if (b[now][e].flag>5)
	{
		for (int i=0;i<n;i++)
		{
			if (b[i][e].flag==5 || b[i][e].flag==10)
			{
				b[i][e].ll+=50;
			}
		}
	} 
}
int main() {
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout);
	cin>>n>>xx>>aa>>bb>>cc;
	for (int i=0;i<n;i++)
	{
		 char s,t;
		 cin>>a[i][1].ll>>a[i][1].rr>>s>>t;
		 a[i][1].flag=1;
		 if (s=='P')
		 {
		 	a[i][1].flag=6;
		 }
		 if (t=='L')
		 {
		 	a[i][1].flag+=1;
		 }
		 if (t=='K')
		 {
		 	a[i][1].flag+=2;
		 }
		 if (t=='C')
		 {
		 	a[i][1].flag+=3; 
		 } 
		 if (t=='G')
		 {
		 	a[i][1].flag+=4;
		 }
	}
	for (int i=0;i<n;i++)
	{
		 char s,t;
		 cin>>a[i][2].ll>>a[i][2].rr>>s>>t;
		 a[i][2].flag=1;
		 if (s=='P')
		 {
		 	a[i][2].flag=6;
		 }
		 if (t=='L')
		 {
		 	a[i][2].flag+=1;
		 }
		 if (t=='K')
		 {
		 	a[i][2].flag+=2;
		 }
		 if (t=='C')
		 {
		 	a[i][2].flag+=3; 
		 } 
		 if (t=='G')
		 {
		 	a[i][2].flag+=4;
		 }
	}
	while (o--)
	{
		for (int i=1;i<=10;i++)
		{
			q[i][1]=q[i][2]=0;
		}
		for (int i=0;i<n;i++)
		{
			b[i][1].ll=a[i][1].ll,b[i][1].rr=a[i][1].rr,b[i][1].flag=a[i][1].flag;
			b[i][2].ll=a[i][2].ll,b[i][2].rr=a[i][2].rr,b[i][2].flag=a[i][2].flag;
			tot[i][1]=tot[i][2]=i;
			q[b[i][1].flag][1]++,q[b[i][2].flag][2]++;
		}
		for (int i=0;i<n;i++)
		{
			if (b[i][1].flag<6)
			{
				b[i][1].ll+=20*(q[2][1]+q[7][1])-20*(b[i][1].flag==2 || b[i][1].flag==7);
			}
			if (b[i][2].flag<6)
			{
				b[i][2].ll+=20*(q[2][2]+q[7][2])-20*(b[i][2].flag==2 || b[i][2].flag==7);
			}
		}
		len1=n,len2=n;
		while (len1 && len2)
		{
			q1=-1,q2=-1;
			int s=get()%len1;
			int t=get()%len2;
			pushup(tot[s][1],1),pushup(tot[t][2],2);
			push(tot[s][1],tot[t][2]);
			if (q1!=-1)
			{
				pushdown(q1,1);
			}
			if (q2!=-1)
			{
				pushdown(q2,2);
			}
		}
		ret1+=len1,ret2+=len2;
	}
	cout<<ret1<<" "<<ret2<<endl;
}