我同学写了一份错误的分治代码(虽说我指出来后,他提出了一个修补方案,我觉得没啥问题,当然代码他还没有修改),考场上提交却通过了这道题.个人觉得可以把这组数据加上.
读入
1
5 20
59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 79 100 80 60 60 60 60 60 99 99 99 99 99 99 99 99
输出
Yoshino
这是他的提交记录
https://www.luogu.com.cn/record/46429645
这是他的代码
#include<bits/stdc++.h>
using namespace std;
int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
return s;
}
int t,k,m;
int a[(1<<18)+10];
int zd(int l,int r)
{
if(l==r) return a[l];
int x=zd(l,(l+r)>>1),y=zd(((l+r)>>1)+1,r);
if(l==1)
{
if(x>a[1]+m) return x;
if(y<=a[1]+m) return a[1];
return y;
}
if(abs(x-y)<=m) return min(x,y);
if(x>y)
{
int mi=x;
for(int i=((l+r)>>1)+1;i<=r;i++)
if(a[i]+m>=x) mi=min(mi,a[i]);
return mi;
}
int mi=y;
for(int i=l;i<=((l+r)>>1);i++)
if(a[i]+m>=y) mi=min(mi,a[i]);
return mi;
}
int main()
{
t=read();
while(t--)
{
k=read();
m=read();
for(int i=1;i<=(1<<k);i++)
a[i]=read();
if(zd(1,1<<k)<=a[1]+m)printf("Kotori\n");
else printf("Yoshino\n");
}
return 0;
}