Submission #1147076

#TimeUsernameProblemLanguageResultExecution timeMemory
1147076woohyun_jngPort Facility (JOI17_port_facility)C++20
78 / 100
3117 ms1114112 KiB
#include <bits/stdc++.h>
#define int long long

#define MAX 3000000
#define MOD 1000000007

using namespace std;
typedef array<int, 2> pr;

int val[MAX], num[MAX], C[MAX];
vector<int> tree[MAX * 4], adj[MAX];

void query(int n, int s, int e, int l, int r, int v) {
    if (r < s || e < l)
        return;
    else if (l <= s && e <= r) {
        for (int i : tree[n])
            adj[i].push_back(v), adj[v].push_back(i);
        while (tree[n].size() > 1)
            tree[n].pop_back();
    } else {
        int m = s + e >> 1;
        query(n << 1, s, m, l, r, v), query(n << 1 | 1, m + 1, e, l, r, v);
    }
}

void update(int n, int s, int e, int x, int v) {
    if (x < s || e < x)
        return;
    tree[n].push_back(v);
    if (s == e)
        return;
    int m = s + e >> 1;
    update(n << 1, s, m, x, v), update(n << 1 | 1, m + 1, e, x, v);
}

bool dfs(int node, int par) {
    for (int i : adj[node]) {
        if (i == par)
            continue;
        if (C[i] != 0 && C[i] == C[node])
            return false;
        else if (C[i] != 0)
            continue;
        C[i] = 3 - C[node];
        if (!dfs(i, node))
            return false;
    }
    return true;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int N, X, Y, ans = 1;

    cin >> N;
    for (int i = 1; i <= N; i++)
        cin >> X >> Y, val[X] = Y, num[X] = i;

    for (int i = 1; i <= (N << 1); i++) {
        if (!val[i])
            continue;
        query(1, 1, N << 1, i, val[i], num[i]);
        update(1, 1, N << 1, val[i], num[i]);
    }

    for (int i = 1; i <= N; i++) {
        if (C[i])
            continue;
        C[i] = 1;
        ans = ((dfs(i, 0) ? ans : 0) << 1) % MOD;
    }

    cout << ans << '\n';

    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...