对于v来说,一开始尽可能的斜着移动,直到遇到边界,或者被p拦截。一旦被p成功拦截那么v必输。
所以问题就变成了p能否成功拦截v。
即v移动的过程中,是否存在一个点,p也刚好,或提前到达这个点。
所以有两种情况:
1.v移动到xv=xp或yv=yp的时候,p成功或提前拦截。
2.v移动到边界后,进行水平或直线移动,直到xv=xp或yv=yp的时候,p提前或成功拦截。
可以看出,拦截点都在(0,0)与(xp,yp)作为对角的矩形的边界上(若能在其他点拦截,也必能在边界上拦截)。
进行分类讨论即可得出答案。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long xp,yp,xv,yv,tim;
while(~scanf("%lld%lld%lld%lld",&xp,&yp,&xv,&yv))
{
tim=min(xv,yv);
if(xv-tim<xp&&yv-tim<yp)
tim=min(tim,max(max(yp-yv,xp-xv),0ll));
xv-=tim;
yv-=tim;
if(xv==0)
{
if(yv>yp)
{
tim+=yv-yp;
yv=yp;
}
}
if(yv==0)
{
if(xv>xp)
{
tim+=xv-xp;
xv=xp;
}
}
tim-=max(xp-xv,0ll);
tim-=max(yp-yv,0ll);
if(tim<0)
printf("Vasiliy\n");
else
printf("Polycarp\n");
}
}