Submission #1219025

#TimeUsernameProblemLanguageResultExecution timeMemory
1219025poatPort Facility (JOI17_port_facility)C++17
0 / 100
0 ms320 KiB
// #pragma GCC optimize("Ofast")
// #pragma GCC target("popcnt")
 
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
// #define double long double
#define mkp make_pair
 
#define txt freopen("shortcut.in", "r", stdin), freopen("shortcut.out", "w", stdout);
const int N = 1e6 + 10, K = 29, inf = 1e16, mod = 1e9 + 7;
const double eps = 1e-6;


struct seg
{
    vector<int> t;
    int n;

    bool fl = 0; // 1 = max, 0 = min

    seg(int n_, int f)
    {
        n = n_;
        fl = f;
        t.resize(n * 4, (fl ? 0 : 1e9));
    }

    int comb(int x, int y)
    {
        return (fl ? max(x, y) : min(x, y));
    }

    void upd(int x, int l, int r, int ind, int val)
    {
        if(l == r)
        {
            t[x] = val;
            return;
        }
        int m = (l + r) / 2;
        if(ind <= m)
            upd(x * 2, l, m, ind, val);
        else
            upd(x * 2 + 1, m + 1, r, ind, val);
        t[x] = comb(t[x * 2], t[x * 2 + 1]);
    }

    int get(int x, int l, int r, int tl, int tr)
    {
        if(tl > tr)
            return (fl ? 0 : 1e9);
        if(l == tl && r == tr)
            return t[x];
        int m = (l + r) / 2;
        return comb(get(x * 2, l, m, tl, min(m, tr)),
                get(x * 2 + 1, m + 1, r, max(tl, m + 1), tr));
    }
};


void solve()
{
    int n;
    cin >> n;

    int A[n + 5], B[n + 5];
    for(int i = 1; i <= n; i++)
        cin >> A[i] >> B[i];
    
    
    vector<vector<int>> ev;
    for(int i = 1; i <= n; i++)
    {
        ev.push_back({A[i], 1, i});
        ev.push_back({B[i], 0, i});
    }

    sort(ev.begin(), ev.end(), [](vector<int> a, vector<int> b){
        return a[0] < b[0];
    });


    vector<int> t1, t2;
    for(auto i : ev)
    {
        if(i[1] == 1)
        {
            if(t1.empty() || B[i[2]] < B[t1.back()])
                t1.push_back(i[2]);
            else if(t2.empty() || B[i[2]] < B[t2.back()])
                t2.push_back(i[2]);
            else
            {
                cout << "0\n";
                return;
            }
        }
        else
        {
            if(!t1.empty() && t1.back() == i[2])
                t1.pop_back();
            else if(!t2.empty() && t2.back() == i[2])
                t2.pop_back();
            else
                assert(0);
        }

        // cout << i[0] << ' ' << i[1] << ' ' << i[2] << '\n';
        // for(auto j : t1)
        //     cout << j << ' ';
        // cout << '\n';
        // for(auto j : t2)
        //     cout << j << ' ';
        // cout << "\n\n";
    }





    seg mn(n * 2, 0), mx(n * 2, 1);

    set<pair<int, int>> siz;

    for(int i = 1; i <= n; i++)
    {
        siz.insert({B[i] - A[i], A[i]});
        mn.upd(1, 1, n * 2, A[i], B[i]);
        mx.upd(1, 1, n * 2, B[i], A[i]);
    }
    
    int res = 0;
    while(!siz.empty())
    {
        int l = siz.begin()->second, r = l + siz.begin()->first;
        siz.erase(siz.begin());

        int x = mn.get(1, 1, n * 2, l + 1, r);


        if(x != 1e9)
        {
            int L = mx.get(1, 1, n * 2, x, x), R = x;
            siz.erase({R - L, L});
            mn.upd(1, 1, n * 2, l, R);
            mn.upd(1, 1, n * 2, L, 1e9);
            mx.upd(1, 1, n * 2, r, 0);
            mx.upd(1, 1, n * 2, R, l);
            
            r = R;
            siz.insert({r - l, l});
        }
        else
        {
            x = mx.get(1, 1, n * 2, l, r - 1);
    
            if(x != 0)
            {
                int L = x, R = mn.get(1, 1, n * 2, x, x);
                siz.erase({R - L, L});
                mn.upd(1, 1, n * 2, L, r);
                mn.upd(1, 1, n * 2, l, 1e9);
                mx.upd(1, 1, n * 2, R, 0);
                mx.upd(1, 1, n * 2, r, L);
                
                l = L;
                siz.insert({r - l, l});
            }
            else
            {
                res++;
                mn.upd(1, 1, n * 2, l, 1e9);
                mx.upd(1, 1, n * 2, r, 0);
            }
        }
    }

    int ans = 1;
    for(int it = res; it--;)
        ans = ans * 2 % mod;

    cout << ans << '\n';
        
}

signed main()
{   
    // txt;
    ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = 1;
    for(; T--; 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...