Red Huang

Red Huang

uva 10627

I think it's a pretty difficult problem. I struggled with it for a long time.

You need to use some techniques and consider precision issues.

The initial idea is that when the faster person runs once, they will definitely collide once.

In addition to colliding directly at the endpoints, there may also be problems with different endpoints.

//  
//        GGGGGGGGGGGGG        CCCCCCCCCCCCC               AAA  
//     GGG::::::::::::G     CCC::::::::::::C              A:::A  
//   GG:::::::::::::::G   CC:::::::::::::::C             A:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C            A:::::::A  
// G:::::G       GGGGGG C:::::C       CCCCCC           A:::::::::A  
//G:::::G              C:::::C                        A:::::A:::::A  
//G:::::G              C:::::C                       A:::::A A:::::A  
//G:::::G    GGGGGGGGGGC:::::C                      A:::::A   A:::::A  
//G:::::G    G::::::::GC:::::C                     A:::::A     A:::::A  
//G:::::G    GGGGG::::GC:::::C                    A:::::AAAAAAAAA:::::A  
//G:::::G        G::::GC:::::C                   A:::::::::::::::::::::A  
// G:::::G       G::::G C:::::C       CCCCCC    A:::::AAAAAAAAAAAAA:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C   A:::::A             A:::::A  
//   GG:::::::::::::::G   CC:::::::::::::::C  A:::::A               A:::::A  
//     GGG::::::GGG:::G     CCC::::::::::::C A:::::A                 A:::::A  
//        GGGGGG   GGGG        CCCCCCCCCCCCCAAAAAAA                   AAAAAAA  
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <cmath>  
#include <climits>  
#include <vector>  
  
#include <set>  
#include <map>  
#include <queue>  
#include <cctype>  
#include <utility>  
#include <ctime>  
using namespace std;  
#ifdef DEBUG  
#define debug(...) printf("!\_\_DEBUG: "),printf(\_\_VA\_ARGS\_\_)  
#define gettime() end\_time=clock();printf("now running time is %.7f\\n",(float)(end\_time - start\_time)/CLOCKS\_PER\_SEC);  
#else  
#define debug(...)  
#define gettime()  
#endif  
typedef unsigned int uint;  
typedef long long int Int;  
#define Set(a,s) memset(a,s,sizeof(a))  
#define Write(w) freopen(w,"w",stdout)  
#define Read(r) freopen(r,"r",stdin)  
#define Pln() printf("\\n")  
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()  
#define De(x)printf(#x"%d\\n",x)  
#define For(i,x)for(int i=0;i<x;i++)  
#define CON(x,y) x##y  
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\  
    printf("%d ",dp\[htx\]\[hty\]);}Pln();}  
#define M 55  
#define PII pair<int,int\>  
#define PB push\_back  
#define oo INT\_MAX  
#define Set\_oo 0x3f  
#define FOR(it,c) for(\_\_typeof((c).begin()) it=(c).begin();it!=(c).end();it++)  
#define eps 1e-10  
bool xdy(double x,double y){return x>y+eps;}  
bool xddy(double x,double y){return x>y-eps;}  
bool xcy(double x,double y){return x<y-eps;}  
bool xcdy(double x,double y){return x<y+eps;}  
bool xeqy(double x,double y){return fabs(x-y)<eps;}  
int min3(int x,int y,int z){  
    int tmp=min(x,y);  
    return min(tmp,z);  
}  
int max3(int x,int y,int z){  
    int tmp=max(x,y);  
    return max(tmp,z);  
}  
Int l,u,v,t;  
Int gcd(Int a,Int b){  
    if(b==0)return a;  
    return gcd(b,a%b);  
}  
void solve(){  
    Int g=gcd(u,v);  
//    debug("%lld %lld\\n",u,v);  
    if(v==0){  
        if(u==0){  
            puts("0");  
            return ;  
        }  
        Int ans=t\*u/l;  
//        debug("%lld\\n",ans);  
        printf("%lld\\n",ans/2+((ans&1)));  
        return ;  
    }  
    long double su=1.0\*l/u,sv=1.0\*l/v;  
    Int ans=(t\*u)/l;  
    Int ans2=(t\*v)/l;  
    Int fans=ans;  
    long double mt=1.0\*l/g;  
//    double r=t-ans\*su;  
//    double r2=t-ans2\*sv;  
    debug("%lld\\n",fans);  
    Int tm=t\*u%l;  
    Int tm2=t\*v%l;  
    tm%=l;tm2%=l;  
        debug("tm>>%lld %lld %lld %lld\\n",tm,tm2,ans,ans2);  
    if(((ans+ans2)&1)&&(tm!=0||tm2!=0)){  
        if(tm>=tm2)fans++;  
    }else{  
        if(tm>=l-tm2)fans++;  
    }  
    debug("%lld\\n",fans);  
    if((u/g-v/g)&1){  
        Int tmp=t/mt;  
        debug("tmp >>%lld %lld %f \\n",tmp,t,mt);  
        fans-=tmp/2;  
        if(xdy(t,tmp\*mt)&&(tmp&1)){  
            fans-=1;  
        }  
    }  
//    debug("%lld %.6f\\n\\n",fans,mt);  
    printf("%lld\\n",fans);  
}  
int main() {  
//    freopen("out.txt","w",stdout);  
    ios\_base::sync\_with\_stdio(0);  
    while(~scanf("%lld%lld%lld%lld",&l,&u,&v,&t)&&l){  
        if(v>u)swap(u,v);  
        solve();  
  
    }  
//        gettime();  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
}  

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.