15 分求助
查看原帖
15 分求助
494699
卷王慢即快楼主2023/12/29 10:27

rt,第二个样例不过。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pr;
const int mod = 1000000007;

inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
	while(ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
	return x * f;
}

int n,m,q,l,op,k,turn=1,pos[2]={1,1},money[2],cnt=0;
//0 is Renko,1 is Merry
int a[107],c[107][107],d[107];
int build[107],sum[2]; //sum[i] 表示一个回合后第 i 个人能拿到的总共的基金
int grade[107]; //第 i 个点上的建筑等级

inline void init(){
	n=read(),m=read(),q=read(),l=read();
	for(int i=1;i<=n;i++)
		for(int j=0;j<l;j++)
			c[i][j]=read();
	for(int i=1;i<=n;i++) d[i]=read();
	
	money[0]=m; money[1]=m;
	memset(build,-1,sizeof(build)); //-1 表示没有建筑
}

inline void work1(int f){
	pos[f]=(pos[f]+k)%n;
	if(pos[f]==0) pos[f]=n;
	
	int t=build[pos[f]]; //这个点的建筑的拥有者
	if(t==-1) return;
	if(t==f) money[f]+=a[pos[f]];
	else{
		money[f]-=a[pos[f]];
		money[!f]+=a[pos[f]];
		if(money[f]<0){
			if(f==0) printf("Renko");
			else printf("Merry");
			exit(0);
		}
	}
}
inline void work2(int f){
	if(build[pos[f]]==(!f)){
		for(int i=1;i<=n;i++)
			if(build[i]!=-1) money[build[i]]+=d[i];
		return;
	}
	int cost=0;
	int x=min(l,grade[pos[f]]+k);
	for(int i=grade[pos[f]];i<=min(l-1,grade[pos[f]]+k-1);i++)
		if(cost+c[pos[f]][i]<=money[f]) cost+=c[pos[f]][i];
		else{
			x=i;
			break;
		}
	if(build[pos[f]]==-1&&cost!=0) build[pos[f]]=f;
	grade[pos[f]]=x;
	a[pos[f]]+=cost;
	money[f]-=cost;

	for(int i=1;i<=n;i++)
		if(build[i]!=-1) money[build[i]]+=d[i];
}

inline void work(){
	while(cin>>op>>k){
		if(op==1) turn=!turn,work1(turn);
		else work2(turn);
	}
	cout<<money[0]<<" "<<money[1];
}

int main(){
	init();
	work();
	return 0;
}
2023/12/29 10:27
加载中...