제출 #1352595

#제출 시각아이디문제언어결과실행 시간메모리
1352595LithaniumAlternating Current (BOI18_alternating)C++20
74 / 100
3094 ms19736 KiB
#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> adj[200005];
int psa[200005];

bool seen[200005];
bool ans[200005];

vector<int> st;
int N, M;

void dfs(int n, int root) {
    seen[n] = 1;
    if (n == root) {
        for (int i:st) ans[i] = 1;
        for (int i = 1; i <= M; i ++) cout << ans[i];
        cout << "\n";
        exit(0);
    }
    for (auto [i, j]:adj[n]) if (!seen[i]) {
        st.push_back(j);
        dfs(i, root);
        st.pop_back();
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> N >> M;
    for (int i = 1; i <= M; i ++) {
        int a, b;
        cin >> a >> b;
        if (a <= b) {
            b ++;
            adj[a].push_back({b, i});
            psa[a] ++;
            psa[b] --;
        } else {
            b ++;
            adj[a].push_back({N+b, i});
            psa[a] ++;
            psa[N+b] --;
        }
    }
    for (int i = 1; i <= 2*N; i ++) {
        psa[i] += psa[i-1];
    }
    for (int i = 1; i <= N; i ++) {
        if (psa[i] + psa[i+N] <= 1) {
            cout << "impossible";
            return 0;
        }
        if (psa[i] + psa[i+N] >= 3) {
            adj[i+1].push_back({i, 0});
            adj[i+N+1].push_back({i+N, 0});
        }
    }
    // for (int i = 1; i <= 2*N; i++) {
    //     for (auto [j, k]:adj[i]) {
    //         cout << i << " " << j << "\n";
    //     }
    // }
    for (int i = 1; i <= N; i ++) {
        memset(seen, 0, sizeof(seen));
        dfs(i, i+N);
    }
    cout << "impossible";
}
#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...