题目链接:Kotori
考虑dp,dp[i][j] 第 i 回合,j 是否可以活下来。
然后我们可以发现每个人在某个回合要打的人是一个区间。然后区间转移即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e6+10;
int n,k,m,a[N],f[N],mi[N];
void solve(){
scanf("%d %d",&k,&m); n=1<<k;
for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=1;
for(int i=1;i<=k;i++){
int l=(1<<(i-1));
for(int j=1;j<=n;j+=l){
int miv=2e9+10;
for(int k=j;k<=j+l-1;k++) if(f[k]) miv=min(miv,a[k]);
for(int k=j;k<=j+l-1;k++) mi[k]=miv;
}
for(int j=1;j<=n;j++){
int cnt=(j+l-1)/l;
if(cnt&1) f[j]&=(a[j]+m>=mi[l*cnt+1]);
else f[j]&=(a[j]+m>=mi[l*(cnt-1)]);
}
}
puts(f[1]?"Kotori":"Yoshino");
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}