这题类似合并排序吧,层层向上递推可能的结果。
#include<bits/stdc++.h>
using namespace std;
int val[512 * 1024] = {0};
int k, m;
int base;
int ts[20];
vector<int> pos[256 * 1024];
void inits() {
ts[0] = 1;
for (int i = 1; i < 20; ++i)
ts[i] = ts[i - 1] * 2;
}
// 这里是合并,向上计算可能的结果
void p2(int n) {
int a = n, b = n + 1;
int pa = 0, pb = 0;
int dist = n / 2;
while(pa < pos[a].size() && pos[a][pa] + m < pos[b][pb]) pa++;
while(pb < pos[b].size() && pos[b][pb] + m < pos[a][pa]) pb++;
while(pa < pos[a].size() && pb < pos[b].size()) {
if (pos[a][pa] < pos[b][pb]) {
pos[dist].push_back(pos[a][pa++]);
} else if (pos[a][pa] > pos[b][pb]) {
pos[dist].push_back(pos[b][pb++]);
} else {
pos[dist].push_back(pos[a][pa++]);
pb++;
}
}
while(pa < pos[a].size()) pos[dist].push_back(pos[a][pa++]);
while(pb < pos[b].size()) pos[dist].push_back(pos[b][pb++]);
}
int p1(int num) {
if (num == 0) {
int temp;
cin >> temp;
return temp;
}
//初始化
for (int i = 1; i < ts[num]; ++i)
pos[i].clear();
// 读入数据,并做第一步处理
for (int i = ts[num]; i < ts[num + 1]; i += 2) {
cin >> val[i] >> val[i + 1];
if (val[i] > val[i + 1])
swap(val[i], val[i + 1]);
if (val[i] + m >= val[i + 1])
pos[i/2].push_back(val[i]);
if (val[i] != val[i + 1])
pos[i/2].push_back(val[i + 1]);
}
// 层层向上计算
while (num > 1) {
num--;
for (int i = ts[num]; i < ts[num + 1]; i += 2) {
p2(i);
}
}
// 最终结果
return pos[1][0];
}
void p() {
bool fail = false;
cin >> k >> m;
cin >> base;
for (int i = 0; i < k; ++i) {
int rs = p1(i);
if (rs > base + m)
fail = true;
}
if (fail)
cout << "Yoshino" << endl;
else
cout << "Kotori" << endl;
}
int main()
{
inits();
int q;
cin >> q;
for (int i = 0; i < q; ++i) {
p();
}
return 0;
}