一个不知道合不合适的建议
查看原帖
一个不知道合不合适的建议
138349
银翼的魔术师楼主2021/2/10 11:54

我同学写了一份错误的分治代码(虽说我指出来后,他提出了一个修补方案,我觉得没啥问题,当然代码他还没有修改),考场上提交却通过了这道题.个人觉得可以把这组数据加上.

读入

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;
}
2021/2/10 11:54
加载中...