比赛 2024国庆练习2 评测结果 AAAAAAAAAWWWWAAAAWWW
题目名称 战棋 最终得分 65
用户昵称 彭欣越 运行时间 0.155 s
代码语言 C++ 内存使用 3.38 MiB
提交时间 2024-10-05 17:46:28
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int xx,AA,BB,CC,N1,N2;
int Getid() {return xx=(xx * AA + BB) % CC;}
ll n,res1,res2,p1,p2,p3,p4;
struct node {
	ll a,b;
	char s1,s2;
}f1[1010],f2[1010],a1[1010],a2[1010];
void f (int x,int y) {
	for (int i=1;i<=n;i++) {
		if (f1[i].b>0) {
			x--;
			if (x==0) {
				x=i;
				break;
			}
		}
	} 
	for (int i=1;i<=n;i++) {
		if (f2[i].b>0) {
			y--;
			if (y==0) {
				y=i;
				break;
			}
		}
	}
	if (f1[x].s1=='P') {
		if (f1[x].s2=='C') {
			f1[x].a+=20*(p1-1);
			f1[x].b+=20*(p1-1);
		}else{
			f1[x].a+=20*p1;
			f1[x].b+=20*p1;
		}
	}
	if (f2[y].s1=='P') {
		if (f2[y].s2=='C') {
			f2[y].a+=20*(p2-1);
			f2[y].b+=20*(p2-1);
		}else{
			f2[y].a+=20*p2;
			f2[y].b+=20*p2;
		}
	}
	f1[x].b-=f2[y].a;
	f2[y].b-=f1[x].a;
	if (f1[x].b<=0) {
		N1--;
		if (f1[x].s2=='C') p1--;
		if (f1[x].s2=='K') {
			for (int i=1;i<=n;i++) {
				if (f1[i].b>0&&f1[i].s1=='M') {
					f1[i].a+=20;
					f1[i].b+=20;
				}
			}
		}
		if (f1[x].s1=='P') {
			for (int i=1;i<=n;i++) {
				if (f1[i].s2=='G'&&f1[i].b>0) {
					f1[i].a+=50;
				}
			}
		}
	}
	if (f2[y].b<=0) {
		N2--;
		if (f2[y].s2=='C') p2--;
		if (f2[y].s2=='K') {
			for (int i=1;i<=n;i++) {
				if (f2[i].b>0&&f2[i].s1=='M') {
					f2[i].a+=20;
					f2[i].b+=20;
				}
			}
		}
		if (f2[y].s1=='P') {
			for (int i=1;i<=n;i++) {
				if (f2[i].s2=='G'&&f2[i].b>0) {
					f2[i].a+=50;
				}
			}
		}
	}
}
int main () {
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout); 
	cin >> n >> xx >> AA >> BB >> CC;
	for (int i=1;i<=n;i++) {
		cin >> a1[i].a >> a1[i].b >> a1[i].s1 >> a1[i].s2;
		if (a1[i].s2=='C') p3++;
	}
	for (int i=1;i<=n;i++) {
		cin >> a2[i].a >> a2[i].b >> a2[i].s1 >> a2[i].s2;
		if (a2[i].s2=='C') p4++;
	}
	int p=500;
	while (p--) {
		N1=n,N2=n;
		p1=p3,p2=p4;
		int flag1=0,flag2=0;
		for (int i=1;i<=n;i++) {
			f1[i]=a1[i];
			if (f1[i].s2=='L') flag1++;
			//if (f1[i].b<=0) N1--; 
			f2[i]=a2[i];
			if (f2[i].s2=='L') flag2++;
			//if (f1[i].b<=0) N2--; 
		} 
		for (int i=1;i<=n;i++) {
			if (f1[i].s1=='M') {
				if (f1[i].s2=='L') f1[i].a+=20*(flag1-1);
				else f1[i].a+=20*flag1;
			}
			if (f2[i].s1=='M') {
				if (f2[i].s2=='L') f2[i].a+=20*(flag2-1);
				else f2[i].a+=20*flag2;
			}
		}
		while (N1&&N2) {
			int x=Getid(),y=Getid();
			f(x%N1+1,y%N2+1);
		}
		res1+=N1;
		res2+=N2;
	}
	cout << res1 <<' '<< res2 <<endl;
	return 0;
}