Submission #1115062

#TimeUsernameProblemLanguageResultExecution timeMemory
1115062lucascgarAlternating Current (BOI18_alternating)C++17
19 / 100
89 ms10824 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
/*
 
*/
 
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef pair<long double, long double> pdd;
 
const int MAXN = 1e5+10;
 
vector<int> w[MAXN];
bool ty[MAXN];

pii cb[MAXN];
int act[MAXN][2];
bool us[MAXN];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    // cout << fixed << setprecision(7);
 
    int n, m;
    cin >> n >> m;
 
    int a, b;
    vector<int> cy;
    for (int i=0;i<m;i++){
        cin >> a >> b;
        cb[i] = {a,b};
        if(b<a){
            if (b==a-1){
                a=1,b=n;
            }else{
                cy.push_back(i);
                continue;
            }
        }
        w[a].push_back(i);
        w[b].push_back(i);
    }
    set<int> cr;

    act[1][0] = act[1][1]=-1;

    for (int i=1;i<=n;i++){
        vector<int> rm;
        while (!w[i].empty()){
            int u = w[i].back();
            w[i].pop_back();
            if (cr.count(u) || act[i][0] == u || act[i][1]==u){
                rm.push_back(u);
            }else{
                cr.insert(u);
            }
        }
 
        if (act[i][0]==-1 && !cr.empty()){
            act[i][0] = *cr.begin();
            cr.erase(cr.begin());
            ty[act[i][0]]=0;
        }
        if (act[i][1]==-1 && !cr.empty()){
            act[i][1] = *cr.begin();
            cr.erase(cr.begin());
            ty[act[i][1]]=1;
        }

        act[i+1][0]=act[i][0], act[i+1][1]=act[i][1];
        for (auto &u:rm){
            cr.erase(u);
            if (act[i][0]==u) act[i+1][0]=-1;
            if (act[i][1]==u) act[i+1][1]=-1;
        }
    }

    for (auto &x:cy){
        a=cb[x].first, b = cb[x].second;
        w[a].push_back(x);
    }

    set<pii> ac; // {esquerda, cara}
    int has[2] = {-1,-1};
    for (int i=1;i<=n;i++){
        while (!w[i].empty()){
            int u = w[i].back();
            w[i].pop_back();
            ac.emplace(cb[u].second, u);
        }

        for (int j=0;j<2;j++) if (has[j]!=-1) act[i][j]=has[j];

        for (int j=0;j<2;j++){
            if (act[i][j]==-1 && !ac.empty()){
                int u = ac.begin()->second;
                ac.erase(ac.begin());
                us[u] = 1, ty[u]=j, has[j]=act[i][j]=u;
            }
        }

    }


    cr.clear();
    set<int> st[2], sc;
    for (auto &x:cy){
        w[cb[x].second].push_back(x);
        if (us[x]) st[ty[x]].insert(x);
        else sc.insert(x);
    }

    for (int i=1;i<=n;i++){
        vector<int> rm;
        while (!w[i].empty()){
            rm.push_back(w[i].back());
            w[i].pop_back();
        }

        bool valid = 1;
        for (int j=0;j<2;j++){
            if (act[i][j]==-1 && st[j].empty()){

                if (sc.empty()){
                    valid = 0;
                    break;
                }

                int u = *sc.begin();
                sc.erase(sc.begin());
                us[u]=1, ty[u]=j;
                st[j].insert(u);

            }
        }

        if (!valid){
            cout << "impossible\n";
            return 0;
        }

        for (auto &u:rm){
            st[0].erase(u);
            st[1].erase(u);
            sc.erase(u);
        }
    }
 
    for (int i=0;i<m;i++) cout << (int)ty[i];
    cout << '\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...