제출 #1345198

#제출 시각아이디문제언어결과실행 시간메모리
1345198ZicrusFire (BOI24_fire)C++20
100 / 100
57 ms13084 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef vector<int> vi;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) x.begin(), x.end()
#define sz(x) (ll)(x).size()
constexpr ll inf = 4e18;
mt19937 mt(time(0));

ll n, m;

struct range {
    ll s, e;

    range(ll s, ll e) {
        this->s = (s % m + m) % m;
        this->e = (e % m + m) % m;
        assert(s != e);
    }
    
    bool contains(ll x) {
        x = (x % m + m) % m;
        if (s < e) return x >= s && x <= e;
        else return x >= s || x <= e;
    }
};

vector<range> read_ranges() {
    vector<pll> tmp(n);
    for (auto &[l, r] : tmp) {
        cin >> l >> r;
        if (l > r) r += m;
        r = -r;
    }
    sort(all(tmp));
    for (auto &[l, r] : tmp) r = -r;

    pll last = pll(-1, -1);
    deque<range> ranges;
    deque<pll> ls;
    for (auto &[l, r] : tmp) {
        if (r <= last.second) continue;
        while (sz(ls) && r - m >= ls[0].second) ranges.pop_front(), ls.pop_front();
        ranges.emplace_back(l, r);
        ls.emplace_back(l, r);
        last = pll(l, r);
    }
    return vector<range>(all(ranges));
}

vector<ll> construct_graph(vector<range> ranges) {
    assert(sz(ranges) == n && n > 1);
    vector<ll> nxt(n);
    ll j = 0;
    for (ll i = 0; i < n; i++) {
        if (j == i) j = (j+1) % n;
        while (j != i && ranges[i].contains(ranges[j].s)) j = (j+1) % n;
        nxt[i] = (n+j-1) % n;
    }
    return nxt;
}

void solve() {
    cin >> n >> m;
    vector<range> ranges = read_ranges();
    n = sz(ranges);
    if (n == 1) return cout << "-1\n", void();
    vector<ll> nxt = construct_graph(ranges);

    ll res = inf;
    vector<bool> vis(n);
    for (ll i = 0; i < n; i++) {
        if (vis[i]) continue;
        deque<ll> cur = {i};
        while (true) {
            assert(sz(cur) >= 1);
            while (true) {
                if (sz(cur) > 1 && ranges[cur.front()].contains(ranges[cur.back()].e)) break;
                if (nxt[cur.back()] == cur.back()) goto skip;
                cur.push_back(nxt[cur.back()]);
                if (vis[cur.back()]) goto skip;
            }
            res = min(res, sz(cur));
            vis[cur.front()] = true;
            cur.pop_front();
        }
        skip:;
        for (auto &e : cur) vis[e] = true;
    }
    if (res == inf) cout << "-1\n";
    else cout << res << '\n';
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    solve();
}
#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...