Submission #1184086

#TimeUsernameProblemLanguageResultExecution timeMemory
1184086mfmme23Port Facility (JOI17_port_facility)C++20
0 / 100
0 ms320 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;

const int MOD = 1000000007;

int main() {
    int N;
    cin >> N;
    vector<pair<int, int>> intervals(N);
    for (int i = 0; i < N; ++i) {
        cin >> intervals[i].first >> intervals[i].second;
    }

    // Контейнеруудыг орж ирэх цагаар эрэмбэлнэ
    sort(intervals.begin(), intervals.end());

    // Граф үүсгэх
    vector<vector<int>> graph(N);
    set<pair<int, int>> active; // {гарах цаг, индекс}

    for (int i = 0; i < N; ++i) {
        int a = intervals[i].first;
        int b = intervals[i].second;

        // active сетээс давхцаж буй интервалуудыг хайж, ирмэг нэмнэ
        auto it = active.lower_bound({a, -1});
        for (auto itr = active.begin(); itr != it; ++itr) {
            int j = itr->second;
            int bj = intervals[j].second;
            if (b < bj) {
                // Хэсэгчлэн давхцаж, бүрэн агуулаагүй
                graph[i].push_back(j);
                graph[j].push_back(i);
            }
        }

        active.insert({b, i});
    }

    // Графыг хоёр өнгөөр будах
    vector<int> color(N, -1);
    int components = 0;
    bool is_bipartite = true;

    for (int i = 0; i < N; ++i) {
        if (color[i] == -1) {
            queue<int> q;
            q.push(i);
            color[i] = 0;
            while (!q.empty()) {
                int u = q.front(); q.pop();
                for (int v : graph[u]) {
                    if (color[v] == -1) {
                        color[v] = color[u] ^ 1;
                        q.push(v);
                    } else if (color[v] == color[u]) {
                        is_bipartite = false;
                        break;
                    }
                }
                if (!is_bipartite) break;
            }
            if (!is_bipartite) break;
            components++;
        }
    }

    if (!is_bipartite) {
        cout << 0 << endl;
    } else {
        // Хариу: 2^components модул MOD
        long long result = 1;
        for (int i = 0; i < components; ++i) {
            result = (result * 2) % MOD;
        }
        cout << result << endl;
    }

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