为防止广告,目前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; }