Submission #1260529

#TimeUsernameProblemLanguageResultExecution timeMemory
1260529niepamietamhaslaAlternating Current (BOI18_alternating)C++20
0 / 100
31 ms8368 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
typedef long long ll;

const int MAXN = 1e5 + 5;

struct d{
    int a;
    int b;
    int nr;
};

int ans[MAXN];

vector<d> dzieci[MAXN];
int P[MAXN];

vector<d> przedzialy;

bool comp(const d &d1, const d &d2){
    if(d1.a != d2.a) return d1.a < d2.a;
    return false;
}

vector<d> wejscie;

int pref[MAXN][2];

int G[MAXN];
int G2[MAXN];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    //cout << n << " " << m << "\n";
    int a, b;
    for(int i = 1; i <= m; ++i){
        cin >> a >> b;
        //cout << a << " " << b << "\n";
        wejscie.push_back({a, b, i});
        if(a > b){
            G[a]++;
            G[1]++;
            G[b+1]--;
        }
        else{
            G[a]++;
            G[b+1]--;
        }
        if(a > b) b += n;
        przedzialy.push_back({a, b, i});
    }
    for(int i = 1; i <= n; ++i){
        G[i] += G[i-1];
        if(G[i] <= 1){
            cout << "impossible\n";
            return 0;
        }
    }
    sort(przedzialy.begin(), przedzialy.end(), comp);
    int ma = 0;
    int ind = -1;
    for(auto u : przedzialy){
        if(ma >= u.b){
            P[u.nr] = ind;
            dzieci[ind].push_back(u);
        }
        else{
            ma = u.b;
            ind = u.nr;
        }
    }
    przedzialy.clear();
    for(int i = 1; i <= m; ++i){
        if(P[i] != 0){
        }
        else{
            przedzialy.push_back(wejscie[i-1]);
        }
    }

    sort(przedzialy.begin(), przedzialy.end(), comp);
    // for(auto u : przedzialy){
    //     cout << u.a << " " << u.b << " U\n";
    // }
    if(przedzialy.size() % 2 == 0){
        for(int i = 0; i < przedzialy.size(); ++i){
            int ktory = (i % 2);
            if(przedzialy[i].a > przedzialy[i].b){
                pref[przedzialy[i].a][ktory]++;
                pref[1][ktory]++;
                pref[przedzialy[i].b+1][ktory]--;
            }
            else{
                pref[przedzialy[i].a][ktory]++;
                pref[przedzialy[i].b+1][ktory]--;
            }
            ans[przedzialy[i].nr] = ktory;
            ktory ^= 1;
            for(auto u : dzieci[przedzialy[i].nr]){
                if(u.a > u.b){
                    pref[u.a][ktory]++;
                    pref[1][ktory]++;
                    pref[u.b+1][ktory]--;
                }
                else{
                    pref[u.a][ktory]++;
                    pref[u.b+1][ktory]--;
                }
                ans[u.nr] = ktory;
            }
        }   
        bool c = true;
        for(int i = 1; i <= n; ++i){
            for(int j = 0; j < 2; ++j){
                pref[i][j] += pref[i-1][j];
                if(pref[i][j] <= 0) c = false;
            }
        }
        if(c){
            for(int i = 1; i <= m; ++i){
                cout << ans[i];
            }
            cout << "\n";
        }
        else{
            cout << "impossible\n";
        }
    }
    else{
        if(przedzialy.size() == 1){
            auto u = przedzialy[0];
            int ktory = 0;
            if(u.a > u.b){
                pref[u.a][ktory]++;
                pref[1][ktory]++;
                pref[u.b+1][ktory]--;
            }
            else{
                pref[u.a][ktory]++;
                pref[u.b+1][ktory]--;
            }
            ans[u.nr] = ktory;
            ktory ^= 1;
            for(auto y : dzieci[u.nr]){
                if(y.a > y.b){
                    pref[y.a][ktory]++;
                    pref[1][ktory]++;
                    pref[y.b+1][ktory]--;
                }
                else{
                    pref[y.a][ktory]++;
                    pref[y.b+1][ktory]--;
                }
                ans[y.nr] = ktory;
            }
            bool c = true;
            for(int i = 1; i <= n; ++i){
                for(int j = 0; j < 2; ++j){
                    pref[i][j] += pref[i-1][j];
                    if(pref[i][j] <= 0) c = false;
                }
            }
            if(c){
                for(int i = 1; i <= m; ++i){
                    cout << ans[i];
                }
                cout << "\n";
            }
            else{
                cout << "impossible\n";
            }
            return 0;
        }
        for(int i = 1; i <= n; ++i){
            if(G[i] > 2) G2[i]++;
            G2[i] += G2[i-1];
        }
        int sajz = przedzialy.size();
        for(int i = 0; i < sajz; ++i){
            int nxt = (i == sajz - 1 ? 0 : i+1);
            auto u = przedzialy[i];
            auto v = przedzialy[nxt];
            //cout << u.a << " " << u.b << " U\n";
            auto intersect = [=](d A, d B) -> vector<pii>{
                if(A.a <= A.b and B.a <= B.b){
                    //cout << "#\n";
                    if(A.b >= B.a) return {{B.a, A.b}};
                    else return {};
                }
                else if(A.a > A.b and B.a > B.b){
                    //cout << "$\n";
                    vector<pii> D;
                    D = {{max(A.a, B.a), n}, {1, min(A.b, B.b)}};
                    if(A.b >= B.a){
                        D.push_back({B.a, A.b});
                    }
                    return D;
                }
                else if(A.a <= A.b and B.a > B.b){
                    //cout << "^\n";
                    if(A.b >= B.a and B.b >= A.a){
                        return {{B.a, A.b}, {A.a, B.b}};
                    }
                    else if(A.b >= B.a){
                        return {{B.a, A.b}};
                    }
                    else if(B.b >= A.a){
                        return {{A.a, B.b}};
                    }
                    else{
                        return {};
                    }
                }
                else{
                    //cout << "&\n";
                    swap(A, B);
                    if(A.b >= B.a and B.b >= A.a){
                        return {{B.a, A.b}, {A.a, B.b}};
                    }
                    else if(A.b >= B.a){
                        return {{B.a, A.b}};
                    }
                    else if(B.b >= A.a){
                        return {{A.a, B.b}};
                    }
                    else{
                        return {};
                    }
                }
            };
            vector<pii> C = intersect(u, v);
            // cout << i << " i\n";
            // for(auto u : C){
            //     cout << u.first << " " << u.second << " pr\n";
            // }
            bool c = true;
            for(auto x : C){
                //cout << x.first << " " << x.second << "X\n";
                //cout << G2[x.second] - G2[x.first - 1] << " " << x.second - x.first + 1 << " por\n";
                if(G2[x.second] - G2[x.first - 1] != x.second - x.first + 1){
                    c = false;
                }
            }
            if(c){
                //cout << i << " i\n";
                //cout << "#\n";
                ans[przedzialy[i].nr] = 0;
                ans[przedzialy[nxt].nr] = 0;
                for(auto u : dzieci[przedzialy[i].nr]){
                    ans[u.nr] = ans[przedzialy[i].nr] ^ 1;
                }
                for(auto u : dzieci[przedzialy[nxt].nr]){
                    ans[u.nr] = ans[przedzialy[nxt].nr] ^ 1;
                }
                if(nxt == 0){
                    //cout << "$\n";
                    for(int j = nxt + 1; j < i; ++j){
                        ans[przedzialy[j].nr] = ans[przedzialy[j - 1].nr] ^ 1;
                        for(auto u : dzieci[przedzialy[j].nr]){
                            ans[u.nr] = ans[przedzialy[j].nr] ^ 1;
                        }
                    }
                    for(int j = 1; j <= m; ++j){
                        cout << ans[j];
                    }
                    cout << "\n";
                    return 0;
                }
                else{
                    for(int j = i - 1; j >= 0; --j){
                        ans[przedzialy[j].nr] = ans[przedzialy[j + 1].nr] ^ 1;
                        for(auto u : dzieci[przedzialy[j].nr]){
                            ans[u.nr] = ans[przedzialy[j].nr] ^ 1;
                        }
                    }
                    for(int j = nxt + 1; j < sajz; ++j){
                        ans[przedzialy[j].nr] = ans[przedzialy[j - 1].nr] ^ 1;
                        for(auto u : dzieci[przedzialy[j].nr]){
                            ans[u.nr] = ans[przedzialy[j].nr] ^ 1;
                        }
                    }
                    for(int j = 1; j <= m; ++j){
                        cout << ans[j];
                    }
                    cout << "\n";
                    return 0;
                }           
            }
        }
        cout << "impossible\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...
#Verdict Execution timeMemoryGrader output
Fetching results...