比赛 |
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;
}