Submission #1045009

#TimeUsernameProblemLanguageResultExecution timeMemory
1045009urd05Bring Down the Grading Server (CEOI23_gradingserver)C++17
100 / 100
2231 ms69916 KiB
#include <bits/stdc++.h>
using namespace std;

long long s;
int q;
typedef pair<long long,long long> P;
typedef pair<long long,P> iP;
map<iP,long long> mp[2];

bool solve(long long a1,long long f1,long long a2,long long f2,int t=0) {
if (a2<=-f1*s) return true;
if (a1<=-f2*s) return false;
    if (a1>=s&&a2<s) {
        return true;
    }
    if (0<a1&&a1<s&&a2<=0) {
if (f2==0) {
return !solve(a2-a1,f2,a1,f1,1-t);
}
        return true;
    }
    if (a1<=0&&a2>=s) {
        return false;
    }
    if (a2>=s) {
        return !solve(a2-a1,f2,a1,f1,1-t);
    }
    if (a1<=0) {
        if (a2<=0) {
            long long tt=min((-a1)/s+1,(-a2)/s+1);
tt=min(tt,f1);
tt=min(tt,f2);
            return solve(a1+tt*s,f1-tt,a2+tt*s,f2-tt,t);
        }
if (f2==0) return false;
        if (f1==0) {
            long long b2=s-a2;
            long long cnt=(-a1)/(b2)+1;
            if (f2>=cnt) {
                return solve(a1+cnt*b2,f1,a2,f2-cnt,t);
            }
            else {
                return false;
            }
        }
        return !solve(a2,f2-1,a1+s,f1,1-t);
    }
assert(0<a1&&a1<s&&a2>0&&a2<s);
        if (f2==0) {
        return !solve(a2-a1,f2,a1,f1,1-t);
    }
    long long b2=s-a2;
    long long b1=s-a1;
    if (b2*f2>=b1) {
        return true;
    }
    if ((s-a1)*(f1+1)>=2*s-a2) {
        long long diff=(s-a1)*(f1+1)-2*s+a2;
        diff=diff/(b2*(f1+1))+1;
        diff=min(diff,f2);
            return solve(a1+b2*diff,f1,a2,f2-diff,t);
    }
    bool flag=false;
    if (f2>10*s||f1>10*s) {
        return true;
    }
    if (b2*max(f1,1LL)>=(10*s+1)/(f2*f2)) {
        return true;
    }
    if (mp[t].find(iP(f1,P(b2,f2)))!=mp[t].end()) {
        long long got=mp[t][iP(f1,P(b2,f2))];
        return a1+s*f2>=got;
    }
    long long lo=0;
    long long hi=1e12+7;
    if (solve(a2,f2-1,hi-s*f2+s,f1,1-t)&&solve(a2-hi+s*f2,f2,hi-s*f2,f1,1-t)) {
        mp[t][iP(f1,P(b2,f2))]=1e17+1;
        return false;
    }
    while (lo+1<hi) {
        long long mid=(lo+hi)/2;
        if (solve(a2,f2-1,mid-s*f2+s,f1,1-t)&&solve(a2-mid+s*f2,f2,mid-s*f2,f1,1-t)) {
            lo=mid;
        }
        else {
            hi=mid;
        }
    }
    mp[t][iP(f1,P(b2,f2))]=hi;
    return (a1+s*f2>=hi);
}

int main(void) {
    scanf("%lld %d",&s,&q);
    for(int i=0;i<q;i++) {
        long long c1,f1,c2,f2;
        scanf("%lld %lld %lld %lld",&c1,&f1,&c2,&f2);
        int got=solve(c1-s*f2,f1,c2-s*f1,f2);
        printf("%s\n",got?"YES":"NO");
    }
}

Compilation message (stderr)

gradingserver.cpp: In function 'bool solve(long long int, long long int, long long int, long long int, int)':
gradingserver.cpp:63:10: warning: unused variable 'flag' [-Wunused-variable]
   63 |     bool flag=false;
      |          ^~~~
gradingserver.cpp: In function 'int main()':
gradingserver.cpp:94:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |     scanf("%lld %d",&s,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~
gradingserver.cpp:97:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         scanf("%lld %lld %lld %lld",&c1,&f1,&c2,&f2);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...