Submission #671752

#TimeUsernameProblemLanguageResultExecution timeMemory
671752stevancvPort Facility (JOI17_port_facility)C++14
0 / 100
6034 ms125516 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sp ' '
#define en '\n'
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
using namespace std;
const int N = 1e6 + 2;
const int mod = 1e9 + 7;
struct Node {
    pair<int, int> mn, mx;
    Node() {
        mn = {mod, -1};
        mx = {-mod, -1};
    }
    Node(int a, int b, int c, int d) {
        mn = {a, b}; mx = {c, d};
    }
    Node Combine(Node a, Node b) {
        mn = min(a.mn, b.mn);
        mx = max(a.mx, b.mx);
    }
}st[8 * N];
Node Combine(Node a, Node b) {
    Node c = Node();
    c.mn = min(a.mn, b.mn);
    c.mx = max(a.mx, b.mx);
    return c;
}
pair<int, int> a[2 * N];
void Init(int node, int l, int r) {
    if (l == r) {
        st[node] = Node(a[l].first, a[l].second, a[l].first, a[l].second);
        return;
    }
    int mid = l + r >> 1;
    Init(2 * node, l, mid);
    Init(2 * node + 1, mid + 1, r);
    st[node].Combine(st[2 * node], st[2 * node + 1]);
}
Node Get(int node, int l, int r, int ql, int qr) {
    if (r < ql || qr < l || ql > qr) return Node();
    if (ql <= l && r <= qr) return st[node];
    int mid = l + r >> 1;
    return Combine(Get(2 * node, l, mid, ql, qr), Get(2 * node + 1, mid + 1, r, ql, qr));
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n; cin >> n;
    vector<int> l(n), r(n);
    for (int i = 0; i < n; i++) {
        cin >> l[i] >> r[i];
        l[i] -= 1; r[i] -= 1;
        a[l[i]] = {r[i], i};
        a[r[i]] = {l[i], i};
    }
    Init(1, 0, 2 * n - 1);
    vector<vector<int>> g(n);
    for (int i = 0; i < n; i++) {
        Node h = Get(1, 0, 2 * n - 1, l[i] + 1, r[i] - 1);
        if (h.mn.first < l[i]) {
            g[i].push_back(h.mn.second);
            g[h.mn.second].push_back(i);
        }
        if (r[i] < h.mx.first) {
            g[i].push_back(h.mx.second);
            g[h.mx.second].push_back(i);
        }
    }
    vector<int> col(n, -1);
    function<void(int, int)> Dfs = [&] (int s, int t) {
        col[s] = t;
        for (int u : g[s]) {
            if (col[u] == -1) Dfs(u, 1 - t);
            else if (col[u] == col[s]) {
                cout << 0 << en;
                exit(0);
            }
        }
    };
    int ans = 1;
    for (int i = 0; i < n; i++) {
        if (col[i] == -1) {
            Dfs(i, 0);
            ans *= 2;
            if (ans >= mod) ans -= mod;
        }
    }
    cout << ans << en;
    return 0;
}

Compilation message (stderr)

port_facility.cpp: In member function 'Node Node::Combine(Node, Node)':
port_facility.cpp:23:5: warning: no return statement in function returning non-void [-Wreturn-type]
   23 |     }
      |     ^
port_facility.cpp: In function 'void Init(int, int, int)':
port_facility.cpp:37:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |     int mid = l + r >> 1;
      |               ~~^~~
port_facility.cpp: In function 'Node Get(int, int, int, int, int)':
port_facility.cpp:45:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   45 |     int mid = l + r >> 1;
      |               ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...