Submission #641565

#TimeUsernameProblemLanguageResultExecution timeMemory
641565baojiaopisuStrange Device (APIO19_strange_device)C++14
100 / 100
1584 ms92880 KiB
#include<bits/stdc++.h>
 
using namespace std;
 
using ll = long long;
using ld = long double;
using ull = unsigned long long;
 
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pld = pair<ld, ld>;
 
#define fi first
#define se second
#define pb push_back
#define pf push_front
#define mp make_pair
#define ins insert
#define btpc __builtin_popcount
#define btclz __builtin_clz
 
#define sz(x) (int)(x.size());
#define all(x) x.begin(), x.end()
#define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
 
template<class X, class Y>
    bool minimize(X &x, const Y &y) {
        if (x > y)
        {
            x = y;
            return true;
        }
        return false;
    }
template<class X, class Y>
    bool maximize(X &x, const Y &y) {
        if (x < y)
        {
            x = y;
            return true;
        }
        return false;
    }
 
const int MOD = 1e9 + 7; //998244353
 
template<class X, class Y>
    void add(X &x, const Y &y) {
        x = (x + y);
        if(x >= MOD) x -= MOD;
    }
 
template<class X, class Y> 
    void sub(X &x, const Y &y) {
        x = (x - y);
        if(x < 0) x += MOD;
    }
 
/* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
 
const ll INF = 2e18;
const int N = 1e5 + 10;

ll gcd(ll a, ll b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}
 
void solve() {
    int n; ll A, B; cin >> n >> A >> B;
    ll m = A / gcd(B + 1, A);
    if(INF / m < B) m = -1;
    else m = m * B;
 
    if(m == -1) m = INF;
    if(m > 1e18) {
        ll ans = 0;
        for(int i = 1; i <= n; i++) {
            ll L, R; cin >> L >> R;
            ans += R - L + 1;
        }
        cout << ans;
        return;
    }

    set<pll> seg;
    for(int i = 1; i <= n; i++) {
        ll L, R; cin >> L >> R;
        if(R - L + 1 >= m) {
            cout << m;
            return;
        }
 
        ll l = L % m;
        if(l + (R - L) >= m) {
            seg.ins(mp(l, m - 1));
            L += (m - 1) - l;
            L++;
            seg.ins(mp(0, R - L));
        } else {
            seg.ins(mp(l, l + (R - L)));
        }
    }
        
    ll ans = 0;
    while(seg.size() > 1) {
        auto iter = seg.begin();
        pll x = (*iter); ++iter; pll y = (*iter);
        if(x.se < y.fi) {
            ans += x.se - x.fi + 1;
            seg.erase(seg.begin());
        } else {
            seg.erase(x);
            seg.erase(y);
            x.fi = min(x.fi, y.fi);
            x.se = max(x.se, y.se);
            seg.ins(x);
        }
    }

    if(seg.size()) {
        auto iter = seg.begin();
        pll x = (*iter);
        ans += x.se - x.fi + 1;
    }

    cout << ans;
}  
 
int main()
{

    int tc = 1, ddd = 0;
    // cin >> tc;
    while(tc--) {
        //ddd++;
        //cout << "Case #" << ddd << ": ";
        solve();
    }
}

Compilation message (stderr)

strange_device.cpp: In function 'int main()':
strange_device.cpp:139:17: warning: unused variable 'ddd' [-Wunused-variable]
  139 |     int tc = 1, ddd = 0;
      |                 ^~~
#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...