//用例
//1:输入:
// 输出:
//2:输入:
// 输出:
//3:输入:
// 输出:
//4:输入:
// 输出:
//5:输入:
// 输出:
//核心代码
//for循环
#include <bits/stdc++.h>
using namespace std;
//#define int long long
int main()
{
#ifndef ONLINE_JUDGE
freopen("data/P8874/P8874.in","r",stdin);
freopen("data/P8874/P8874_2.out","w",stdout);
#endif
int n, m, q, l;
cin >> n >> m >> q >> l;
long long c[n][l]; // 每层建筑的钱
long long player_money[2]; // 玩家的钱
int player_pos[2]; // 玩家的位置
int b_level[n]; // 每个建筑的级别
long long b_money[n]; // 每个建筑物当前的费用
int b_owner[n]; // 每个建筑的所有者
long long d[n]; // 每个建筑的周期费用
int cur_player = -1; // 当前玩家,0是renko,1是merry,cur_player ^ 1就表示另外一个玩家
int o, k; // 操作码和k
string player_name[] = {"Renko", "Merry"};
// 初始化所有玩家的钱
player_money[0] = m;
player_money[1] = m;
// 初始化玩家的位置
player_pos[0] = 0;
player_pos[1] = 0;
// 初始化每个建筑每层的价格
for (int i = 0; i < n; i++)
{
for (int j = 0; j < l; j++)
{
cin >> c[i][j];
}
}
// 初始化每个建筑的基础层级为0
memset(b_level, 0, sizeof(b_level));
// 初始化每个建筑的当前费用为0
memset(b_money, 0, sizeof(b_money));
// 初始化每个建筑的所有者为-1,表示没有人
memset(b_owner, -1, sizeof(b_owner));
for (int i = 0; i < n; i++)
{
cin >> d[i];
}
while(cin >> o >> k)
{
if (o == 1)
{
// 换玩家
cur_player = (cur_player + 1) % 2;
if (cur_player == 0)
{
// 每个玩家加钱
for (int i = 0; i < n; i++)
{
if (b_owner[i] != -1)
{
// 当前建筑有所属人,则给建筑的所属人加当前建筑的d费
player_money[b_owner[i]] += d[i];
}
}
}
// 玩家走
for (int i = 0; i < k; i++)
{
// 走一格
player_pos[cur_player] = (player_pos[cur_player] + 1) % n;
// 看看当前格子有没有建筑
if (b_owner[player_pos[cur_player]] == -1)
{
continue;
}
else if(b_owner[player_pos[cur_player]] == cur_player)
{
// 给当前用户加钱
player_money[cur_player] += b_money[player_pos[cur_player]];
}
else
{
// 减去当前建筑费用
player_money[cur_player] -= b_money[player_pos[cur_player]];
// 不是当前用户
if (player_money[cur_player] < 0)
{
// 钱不够,输出当前用户,游戏结束
cout << player_name[cur_player];
return 0;
}
player_money[cur_player ^ 1] += b_money[player_pos[cur_player]];
}
}
}
else
{
if (b_owner[player_pos[cur_player]] == cur_player || b_owner[player_pos[cur_player]] == -1)
{
// 将建筑所属设置为当前玩家
b_owner[player_pos[cur_player]] = cur_player;
// 允许升级
for (int i = 0; i < k; i++)
{
if (b_level[player_pos[cur_player]] + 1 > l) break;// 当前建筑的级别已经到最高,不能升级
if (c[player_pos[cur_player]][b_level[player_pos[cur_player]]] > player_money[cur_player])
break; // 没钱,不能升级
// 扣钱
player_money[cur_player] -= c[player_pos[cur_player]][b_level[player_pos[cur_player]]];
// 升级
b_money[player_pos[cur_player]] += c[player_pos[cur_player]][b_level[player_pos[cur_player]]];
b_level[player_pos[cur_player]]++;
}
}
}
}
// 每个玩家加钱
for (int i = 0; i < n; i++)
{
if (b_owner[i] != -1)
{
// 当前建筑有所属人,则给建筑的所属人加当前建筑的d费
player_money[b_owner[i]] += d[i];
}
}
// 输出
cout << player_money[0] << " " << player_money[1];
return 0;
}
//耗时:
//测试次数:
//提交次数:
//评分:
//时间复杂度:
//空间复杂度:
//类型:模拟与高精度
//大改:次
//小改:次
实在是不知道到底哪里有错