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