Kotori

题目链接: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;
}
上一篇:C++ 网络爬虫 之 获取小米笔记本的最新驱动信息


下一篇:GDKOI 2021 提高组 Day2 第二题 群岛(线段树)