제출 #1348568

#제출 시각아이디문제언어결과실행 시간메모리
1348568cnam9Joker (BOI20_joker)C++20
0 / 100
2 ms2084 KiB
#include <iostream>
#include <algorithm>

using namespace std;

constexpr int N = 2e5 + 5;
pair<int, int> edges[N];
int f[N];

template <class T, size_t N>
class BufferedStack {
    T buf[N];
    T *end = buf;

public:
    void push(T value) { *end++ = value; }
    T pop() { return *--end; }
};

namespace DSU {
    int parent[N], size[N];
    bool parity[N];
    int nonbipartiteness;
    BufferedStack<int, N> history;

    void init(int n) {
        fill(parent, parent + n, -1);
        fill(size, size + n, 1);
        nonbipartiteness = 0;
    }

    pair<int, bool> find_set(int v) {
        if (parent[v] == -1) return {v, 0};
        pair<int, bool> p = find_set(parent[v]);
        return {p.first, parity[v] ^ p.second};
    }

    void add_edge(int e) {
        auto [u, x] = find_set(edges[e].first);
        auto [v, y] = find_set(edges[e].second);

        if (u == v) {
            nonbipartiteness += x == y;
            history.push(~(x == y));
            return;
        }

        if (size[u] < size[v]) swap(u, v);
        size[u] += size[v];
        parent[v] = u;

        parity[v] = x ^ y ^ 1;
        history.push(v);
    }

    void rollback(int t = 1) {
        while (t--) {
            int v = history.pop();

            if (v < 0) {
                nonbipartiteness -= ~v;
                continue;
            }

            int u = parent[v];
            parity[v] = 0;

            parent[v] = -1;
            size[u] -= size[v];
        }
    }

    inline bool is_bipartite() {
        return nonbipartiteness == 0;
    }
};

void dnc(int l, int r, int fl, int fr) {
    if (l >= r) return;

    int m = l + r + 1 >> 1;


    for (int e = r; e > m; e--) {
        DSU::add_edge(e);
    }
    // if (m == 4) {
        // cout << DSU::nonbipartiteness << endl;
        // exit(0);
    // }
    for (f[m] = fl; f[m] < min(fr, m) && DSU::is_bipartite(); f[m]++) {
        DSU::add_edge(f[m] + 1);
    }
    DSU::rollback(r - m + f[m] - fl);


    for (int e = r; e >= m; e--) {
        DSU::add_edge(e);
    }
    dnc(l, m - 1, fl, f[m]);
    DSU::rollback(r - m + 1);


    for (int e = fl + 1; e <= f[m]; e++) {
        DSU::add_edge(e);
    }
    dnc(m, r, f[m], fr);
    DSU::rollback(f[m] - fl);
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    freopen("input.txt", "r", stdin);

    int n, m, q;
    cin >> n >> m >> q;

    for (int e = 1; e <= m; e++) {
        int u, v;
        cin >> u >> v;
    
        edges[e] = {u - 1, v - 1};        
    }

    DSU::init(n);
    dnc(0, m, 0, m);

    // for (int r = 0; r <= m; r++) {
    //     cout << "(" << f[r] << ", " << r << "]" << endl;
    // }

    while (q--) {
        int l, r;
        cin >> l >> r;
        l--;

        cout << (l >= f[r] ? "YES\n" : "NO\n");
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Joker.cpp: In function 'int main()':
Joker.cpp:117:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  117 |     freopen("input.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...