제출 #240423

#제출 시각아이디문제언어결과실행 시간메모리
240423valerikk이상한 기계 (APIO19_strange_device)C++11
25 / 100
5071 ms507708 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define int ll

ll gcd(ll a, ll b) {
    while (b != 0LL) {
        a %= b;
        swap(a, b);
    }
    return a;
}

struct E {
    ll x;
    int k;
    ll l, r;

    bool operator<(const E& o) {
        return x < o.x || (x == o.x && k < o.k);
    }

    E() {}
    E(ll x, int k, ll l, ll r) : x(x), k(k), l(l), r(r) {}
};

ll n, a, b;

ll p;

vector<E> v;

void push(ll l, ll r, ll x, ll y) {
    v.emplace_back(l, 0, x, y);
    v.emplace_back(r+1, 1, x, y);
}

void add(ll l, ll r, ll x, ll y) {
    if (x <= y) {
        push(l, r, x, y);
    } else {
        push(l, r, 0LL, y);
        push(l, r, x, p-1LL);
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> a >> b;
    p = a/gcd(a, b+1);
    while (n--) {
        ll l, r;
        cin >> l >> r;
        ll x = l/b, y = r/b;
        if (x == y) {
            add(l%b, r%b, x%p, y%p);
        } else {
            if (y-x > 1) {
                add(0LL, b-1LL, (x+1LL)%p, (y-1LL)%p);
            }
            add(l%b, b-1LL, x%p, x%p);
            add(0LL, r%b, y%p, y%p);
        }
    }
    sort(v.begin(), v.end());
    multiset<pair<ll, ll>> s;
    ll ans = 0;
    for (int i = 0; i+1 < v.size(); ++i) {
        if (v[i].k) {
            s.erase(s.find({v[i].l, v[i].r}));
        } else {
            s.insert({v[i].l, v[i].r});
        }
        ll d = v[i+1].x-v[i].x;
        if (d) {
            vector<pair<ll, ll>> u;
            for (auto ss : s) {
                u.emplace_back(ss.first, -1);
                u.emplace_back(ss.second+1, 1);
            }
            sort(u.begin(), u.end());
            ll q = 0;
            int bal = 0;
            for (int j = 0; j+1 < u.size(); ++j) {
                bal -= u[j].second;
                if (bal) q += u[j+1].first-u[j].first;
            }
            ans += q*d;
        }
    }
    cout << ans;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

strange_device.cpp: In function 'int main()':
strange_device.cpp:70:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i+1 < v.size(); ++i) {
                     ~~~~^~~~~~~~~~
strange_device.cpp:86:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int j = 0; j+1 < u.size(); ++j) {
                             ~~~~^~~~~~~~~~
#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...