为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/147

来自NOCOW
< Sgu
跳转到: 导航, 搜索

弄了一晚,终于AC了

//by hza
#include<cstdio>
 
const int INF=1<<30;
int answer=INF;
int meetstep;
 
void swap(int& a,int& b)
{
	int t=a;a=b;b=t;
}
 
int abs(int a){return a<0?-a:a;}
 
struct king
{
	int x,y;
	void init(){scanf("%d%d",&x,&y);}
	void print(){printf("%d %d\n",x,y);}
	void king_swap(){swap(x,y);}
}black,white,bw;
 
int n;
 
void get(king& a,int& l,int &r,int i)
{
	l=a.y-i;r=a.y+i;
	if(l<=0)l=1;
	if(r>n)r=n;
}
 
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
 
int inside(int a,int l,int r)
{	
	return a>=l&&a<=r;
}
 
void init()
{
	scanf("%d",&n);
	black.init();
	white.init();
	bw.init();
	if( abs(black.x-white.x)<abs(black.y-white.y) )
	{
		black.king_swap();white.king_swap();
		bw.king_swap();
	}
	meetstep=abs(black.x-white.x)-1;
}
 
void check(king& black,king& white,int x)
{
	int l1,l2,r1,r2;
	get(black,l1,r1,abs(x-black.x));
	get(white,l2,r2,abs(x-white.x));
	int l,r;
	l=max(l1,l2);r=min(r1,r2);
	if(l>r)return;
	int time=abs(x-black.x);
	if(time>(meetstep-1)/2)time=-1;
	if((time>=abs(bw.x-x)&&(inside(bw.y+time,l,r)||inside(bw.y-time,l,r)))
	||(time==abs(bw.x-x)&&!((bw.y-time)>r||(bw.y+time)<l)))
		if(time<answer)answer=time;
	time=abs(x-white.x);
	if(time>(meetstep-1)/2)time=-1;
	if((time>=abs(bw.x-x)&&(inside(bw.y+time,l,r)||inside(bw.y-time,l,r)))
	||(time==abs(bw.x-x)&&!((bw.y-time)>r||(bw.y+time)<l)))
		if(time<answer)answer=time;
}
 
 
void solve(king black,king white)
{
	int s=min(black.x,white.x),t=max(black.x,white.x),i;
	for(i=s;i<=t;++i)
		check(black,white,i);
}
 
int main()
{
	freopen("147.in","r",stdin);
	freopen("147.out","w",stdout);
	init();
	solve(black,white);
	if(answer!=INF)printf("YES\n%d\n",answer);
	else printf("NO\n%d\n",meetstep);
}
/by Logic
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,d,st,ans;
struct Point
{
	int x,y;
	Point() {}
	Point(int x,int y):x(x),y(y) {}
	void scan() { scanf("%d%d",&x,&y); }
	void print() { printf("%d %d\n",x,y); }
};
Point b,w,bw,bl,br,wl,wr;
char res[2][5]={"NO","YES"};
int dis(Point a,Point b)
{
	 return max(abs(a.x-b.x),abs(a.y-b.y));
}
int fail(Point k) 
{
	int d0=dis(bw,Point(k.x,k.y));
	if(d0>st) return 1;
	else if(d0<st) return -1;
	return 0;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
#endif
	scanf("%d",&n);
	b.scan(),w.scan(),bw.scan();
	if(abs(b.x-w.x)>abs(b.y-w.y)) swap(b.x,b.y),swap(w.x,w.y),swap(bw.x,bw.y);
	if(b.y<w.y) swap(b,w);
	d=dis(b,w)-1;
	bl=br=b,wl=wr=w;
	//b.print(),w.print(),bw.print(),printf("\n");
	for(st=0;st<(d+1)/2&&fail(bl)*fail(br)>0&&fail(wl)*fail(wr)>0;st++)
	{
		if(bl.x>1&&w.x-bl.x+1<bl.y-w.y) bl.x--;
		else if(w.x-bl.x+1>bl.y-w.y) bl.x++;
		if(br.x<n&&br.x-w.x+1<br.y-w.y) br.x++;
		else if(br.x-w.x+1>br.y-w.y) br.x--;
		bl.y--,br.y--;
		if(wl.x>1&&b.x-wl.x+1<b.y-wl.y) wl.x--;
		else if(b.x-wl.x+1>b.y-wl.y) wl.x++;
		if(wr.x<n&&wr.x-b.x+1<b.y-wr.y) wr.x++;
		else if(wr.x-b.x+1>b.y-wr.y) wr.x--;
		wl.y++,wr.y++;
		//bl.print(),br.print(),wl.print(),wr.print();
	}
	ans=(st<(d+1)/2);
	printf("%s\n%d\n",res[ans],ans?st:d);
	return 0;
}
个人工具