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