Submission #633518

#TimeUsernameProblemLanguageResultExecution timeMemory
633518SonStrange Device (APIO19_strange_device)C++14
100 / 100
464 ms53172 KiB
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define se second
#define fi first
#define mp make_pair


int n;
LL A,B;
LL L[1000005], R[1000005];
set < pair < LL , LL > > S;

LL gcd( LL a , LL b ){
    if ( b == 0 ) return a;
    return gcd(b,a%b);
}

LL add( LL l, LL r ){
    LL ans = 0;
    while ( true ){
        auto it = S.lower_bound({l,-1});
        if ( it != S.end() ){
            LL ll = it->se, rr = it->fi;
            if ( rr < l || ll > r ) break;
            if ( ll < l ){
                if ( rr <= r ){
                    S.erase(it);
                    ans += rr - l + 1;
                    S.insert({l-1,ll});
                } else if ( rr > r ){
                    S.erase(it);
                    ans += r - l + 1;
                    S.insert({l-1,ll});
                    S.insert({rr,r+1});
                }
            } else if ( ll >= l ){
                if ( rr <= r ){
                    ans += rr - ll + 1;
                    S.erase(it);
                } else if (rr > r) {
                    S.erase(it);
                    ans += r - ll + 1;
                    S.insert({rr,r+1});
                }
            }
        } else break;
    }

    while ( true ){
        auto it = S.lower_bound({l,-1});
        if ( it != S.begin() ){
            it--;
            LL ll = it->se, rr = it->fi;
            if ( rr < l || ll > r ) break;
            if ( ll < l ){
                if ( rr <= r ){
                    S.erase(it);
                    ans += rr - l + 1;
                    S.insert({l-1,ll});
                } else if ( rr > r ){
                    S.erase(it);
                    ans += r - l + 1;
                    S.insert({l-1,ll});
                    S.insert({rr,r+1});
                }
            } else if ( ll >= l ){
                if ( rr <= r ){
                    ans += rr - ll + 1;
                    S.erase(it);
                } else if (rr > r) {
                    S.erase(it);
                    ans += r - ll + 1;
                    S.insert({rr,r+1});
                }
            }
        } else break;
    }
    return ans;
}

int main(){

    scanf("%d%lld%lld",&n,&A,&B);
    for ( int i = 1; i <= n; i++ ){
        scanf("%lld%lld",&L[i],&R[i]);
    }
    LL g = gcd(A,B+1);
    LL ag = A / g;
    if ( R[n] / ag + ((R[n] % ag) > 0) < B ){
        LL ans = 0;
        for ( int i = 1; i <= n; i++ ){
            ans += R[i] - L[i] + 1;
        }
        printf("%lld\n",ans);
    } else {
        LL ans = 0;
        LL cap = ag * 1LL * B;
        S.clear();
        S.insert({cap-1,0});
        for ( int i = 1; i <= n; i++ ){
            if ( (R[i] - L[i] + 1) / cap > 0 ){
                ans = cap;
                break;
            } else {
                if ( L[i] % cap <= R[i] % cap ){
                    ans += add(L[i]%cap, R[i]%cap);
                } else {
                    ans += add(L[i] % cap, cap - 1) + add(0,R[i] % cap);
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

Compilation message (stderr)

strange_device.cpp: In function 'int main()':
strange_device.cpp:84:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |     scanf("%d%lld%lld",&n,&A,&B);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
strange_device.cpp:86:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |         scanf("%lld%lld",&L[i],&R[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...