记录编号 222195 评测结果 AAAAAAAAAA
题目名称 [USACO Dec02]奶牛职业网球赛 最终得分 100
用户昵称 GravatarPyh 是否通过 通过
代码语言 C++ 运行时间 0.174 s
提交时间 2016-01-29 11:07:57 内存使用 4.00 MiB
显示代码纯文本
//
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int t,k,n,l=1,r,ans=0,tot;

int fa[100000];
bool in[100000];
int num[100000];

inline int Max(int x,int y){
	return x>y?x:y;
}

inline int Min(int x,int y){
	return x<y?x:y;
}

int find(int x){
	int tmp=x,pre;
	while(tmp!=fa[tmp])tmp=fa[tmp];
	while(x!=tmp){
		pre=fa[x];
		fa[x]=tmp;
		x=pre;
	}
	return tmp;
}

bool pan(int x){
//	printf("---------%d----------\n",x);
	in[x]=true;
	num[1]=x;
	fa[x]=x+1;
	int cnts=1,rcnts=1;
	for(int step=1;step<=t;step++){
		for(int i=1;i<=cnts;i++){
			int ks=num[i];
			int j=find(Max(1,ks-k));
			for(;j<=n;j=find(j))if(j!=ks&&!in[j]&&j!=x){
				if(j==0)return false;
				fa[j]=j+1;
				tot++;
//				printf("(%d,%d)\n",ks,j);
				in[j]=true;
				num[++rcnts]=j;
				break;
			}
		}
		cnts=rcnts;
//		printf("\n");
	}
	return true;
}

int main(){
	freopen("btp.in","r",stdin);
	freopen("btp.out","w",stdout);
	scanf("%d%d",&n,&k);
	int tmp=n;
	r=n;
	while(!(tmp&1)){tmp/=2;t++;}
	while(l<=r){
		int mid=(l+r)/2;
		memset(in,0,sizeof in);
		for(int i=1;i<=n;i++)fa[i]=i;
		bool flag=pan(mid);
		if(flag){
			if(mid>ans)ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	tot++;
	printf("%d\n",ans);
	return 0;	
}