제출 #1342329

#제출 시각아이디문제언어결과실행 시간메모리
1342329kawhiet이상한 기계 (APIO19_strange_device)C++20
20 / 100
782 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

struct SparseSegmentTree {
    struct Node {
        int sum = 0;
        int lazy = 0;
        Node *left = nullptr;
        Node *right = nullptr;
    };

    int n;
    Node *root;

    SparseSegmentTree(int _n) {
        n = _n;
        root = new Node();
    }

    void apply(Node *cur, int len, int val) {
        cur -> lazy = val;
        cur -> sum = len * val;
    }

    void push(Node *cur, int l, int r) {
        if (cur -> left == nullptr) cur -> left = new Node;
        if (cur -> right == nullptr) cur -> right = new Node;
        if (cur -> lazy == 0) return;
        int m = (l + r) / 2;
        apply(cur -> left, m - l + 1, cur -> lazy);
        apply(cur -> right, r - m, cur -> lazy);
        cur -> lazy = 0;
    }

    void update(Node *cur, int tl, int tr, int l, int r, int v) {
        if (r < tl || tr < l) return;
        if (l <= tl && tr <= r) {
            apply(cur, tr - tl + 1, v);
            return;
        }
        push(cur, tl, tr);
        int tm = (tl + tr) / 2;
        update(cur -> left, tl, tm, l, r, v);
        update(cur -> right, tm + 1, tr, l, r, v);
        cur -> sum = cur -> left -> sum + cur -> right -> sum;
    }

    int get(Node *cur, int tl, int tr, int l, int r) {
        if (cur == nullptr) return 0;
        if (r < tl || tr < l) return 0;
        if (l <= tl && tr <= r) return cur -> sum;
        push(cur, tl, tr);
        int tm = (tl + tr) / 2;
        return get(cur -> left, tl, tm, l, r) + get(cur -> right, tm + 1, tr, l, r);
    }

    void update(int l, int r, int v) { update(root, 0, n - 1, l, r, v); }
    int get(int l, int r) { return get(root, 0, n - 1, l, r); }
};

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, a, b;
    cin >> n >> a >> b;
    int sum = 0;
    vector<int> l(n), r(n);
    for (int i = 0; i < n; i++) {
        cin >> l[i] >> r[i];
        sum += r[i] - l[i] + 1;
    }
    int g = gcd(a, b + 1);
    if (__int128(a) * b / g >= 1e18) {
        cout << sum << '\n';
        return 0;
    }
    int x = a / g * b;
    for (int i = 0; i < n; i++) {
        if (r[i] - l[i] + 1 > x) {
            cout << x << '\n';
            return 0;
        }
    }
    for (int i = 0; i < n; i++) {
        l[i] %= x;
        r[i] %= x;
    }
    SparseSegmentTree t(x + 10);
    for (int i = 0; i < n; i++) {
        if (l[i] <= r[i]) {
            t.update(l[i], r[i], 1);
        } else {
            t.update(l[i], x - 1, 1);
            t.update(0, r[i], 1);
        }
    }
    cout << t.get(0, x - 1) << '\n';
    return 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...