Submission #1310602

#TimeUsernameProblemLanguageResultExecution timeMemory
1310602harryleeeFire (BOI24_fire)C++20
0 / 100
2 ms1860 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5;
int n, m, nxt[maxn + 1], ttime;
int ans = maxn + 5;
int vis[maxn + 1];
vector<int> value;
pair<int, int> a[maxn + 1];

struct SEGMENT_TREE{
    vector<pair<int, int>> st;

    inline SEGMENT_TREE(int n){
        st.resize(4 * n + 4, {0, 0});
    }
    inline void update(int ind, int l, int r, int pos, int val, int id){
        if (l == r){
            st[ind] = max(st[ind], make_pair(val, id));
            return;
        }
        int mid = (l + r) >> 1;
        if (mid >= pos) update(ind << 1, l, mid, pos, val, id);
        else update(ind << 1 | 1, mid + 1, r, pos, val, id);
        st[ind] = max(st[ind << 1], st[ind << 1 | 1]);
        return;
    }
    inline pair<int, int> get(int ind, int l, int r, int lb, int rb){
        if (lb > rb) return {0, 0};
        if (l >= lb && r <= rb) return st[ind];
        int mid = (l + r) >> 1;
        pair<int, int> res = {0, 0};
        if (mid >= lb) res = max(res, get(ind << 1, l, mid, lb, rb));
        if (mid < rb) res = max(res, get(ind << 1 | 1, mid + 1, r, lb, rb));
        return res;
    }
};

inline int DFS(int u){
    vis[u] = ttime;
    int v = nxt[u];
    if (v == -1)
        return maxn + 5;
    if (vis[v] == 0)
        return DFS(v);
    if (vis[v] == ttime){
        int start = v, res = 0;
        while(true){
            res++;
            if (start == u) 
                break;
            start = nxt[start];
        }
        return res;
    }
    return 0;
}   

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    memset(vis, 0, sizeof(vis));

    cin >> n >> m;
    for (int i = 1; i <= n; ++i){
        cin >> a[i].first >> a[i].second;
        value.push_back(a[i].first);
        value.push_back(a[i].second);
    }

    sort(value.begin(), value.end());
    value.erase(unique(value.begin(), value.end()), value.end());
    SEGMENT_TREE seg(value.size());

    for (int i = 1; i <= n; ++i){
        int pos = lower_bound(value.begin(), value.end(), a[i].first) - value.begin();
        int val = a[i].second;
        if (a[i].second < a[i].first) 
            val += m;
        // cout << pos << ' ' << val << '\n';
        seg.update(1, 0, value.size() - 1, pos, val, i);
    }

    for (int i = 1; i <= n; ++i){
        int it1 = lower_bound(value.begin(), value.end(), a[i].first) - value.begin();
        int it2 = lower_bound(value.begin(), value.end(), a[i].second) - value.begin();
        pair<int, int> opt = {0, 0};
        if (a[i].second < a[i].first)
            opt = max(seg.get(1, 0, value.size() - 1, it1 + 1, value.size() - 1), seg.get(1, 0, value.size() - 1, 0, it2));
        else
            opt = seg.get(1, 0, value.size() - 1, it1 + 1, it2);
        if (opt.first <= a[i].second)
            nxt[i] = -1;
        else
            nxt[i] = opt.second;
        // cout << opt.first << ' ' << opt.second << '\n';
    }

    for (int i = 1; i <= n; ++i) if (vis[i] == 0){
        ++ttime;
        ans = min(ans, DFS(i));
    }


    if (ans == maxn + 5) ans = -1;
    cout << ans;
    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...