Submission #1282316

#TimeUsernameProblemLanguageResultExecution timeMemory
1282316Bui_Quoc_CuongPort Facility (JOI17_port_facility)C++20
0 / 100
23 ms16152 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e6 + 5;
const int MOD = 1e9 + 7;

int n;
pair <int, int> a[maxN];
int vis[4 * maxN];
int lab[4 * maxN];
vector <int> g[4 * maxN];
int st_min[4 * maxN], st_max[4 * maxN];

int find (int x) {return lab[x] < 0 ? x : lab[x] = find(lab[x]);}

bool joint (int u, int v)
{
    int x = find(u), y = find(v);
    if (x == y) return false;
    if (lab[x] > lab[y]) swap (x, y);
    lab[x]+= lab[y];
    lab[y] = x;
    return 1;
}

void add (int u, int v)
{
    joint (u, v + n);
    joint (v, u + n);
    if (find(u) == find(u + n))
    {
        cout << 0;
        exit(0);
    }
    if (find(v) == find(v + n))
    {
        cout << 0;
        exit(0);
    }
}

void build (int id, int l, int r)
{
    if (l == r)
    {
        st_min[id] = 1e9;
        st_max[id] = 0;
        return;
    }
    int mid = (l + r) >> 1;
    build (id << 1, l, mid);
    build (id << 1 | 1, mid + 1, r);
}

void up (int pos, int val)
{
    int id = 1, l = 1, r = 2 * n;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (pos <= mid) id = id << 1, r = mid;
        else id = id << 1 | 1, l = mid + 1;
    }
    st_min[id] = st_max[id] = val;
    while (id > 1)
    {
        id >>= 1;
        st_max[id] = max(st_max[id << 1], st_max[id << 1 | 1]);
        st_min[id] = min(st_min[id << 1], st_min[id << 1 | 1]);
    }
}

void addEdge (int id, int l, int r, int u, int v, int pos)
{
    if (l > v || r < u || st_max[id] == 0) return;
    if (l >= u && r <= v)
    {
        if (st_max[id] == st_min[id])
        {
            add (pos, st_max[id]);
          //  cout << pos << " " << st_max[id] << "\n";
            g[st_max[id]].push_back(pos);
            return;
        }
        if (l == r)
        {
          //  cout << pos << " " << st_max[id] << "\n";
            g[st_max[id]].push_back(pos);
            add (pos, st_max[id]);
            return;
        }
    }
    int mid = (l + r) >> 1;
    addEdge (id << 1, l, mid, u, v, pos);
    addEdge (id << 1 | 1, mid + 1, r, u, v, pos);
    st_max[id] = max (st_max[id << 1], st_max[id << 1 | 1]);
    st_min[id] = min (st_min[id << 1], st_min[id << 1 | 1]);
}

void dfs (int u)
{
    vis[u] = 1;
    for (int &v : g[u]) if (!vis[v]) dfs(v);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i].first >> a[i].second;
    sort (a + 1, a + 1 + n);

    memset(lab, - 1, sizeof lab);
    build (1, 1, 2 * n);

    for (int i = 1; i <= n; i++)
    {
        addEdge (1, 1, 2 * n, a[i].first, a[i].second, i);
        up (a[i].second, i);
    }

    int ans = 1;
    for (int i = 1; i <= n; i++)
    {
        if (!vis[i])
        {
            dfs(i);
            ans = 1LL * 2 * ans % MOD;
        }
    }
    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...