Submission #1116586

# Submission time Handle Problem Language Result Execution time Memory
1116586 2024-11-21T20:55:40 Z lucascgar Alternating Current (BOI18_alternating) C++17
0 / 100
50 ms 13396 KB
#include <bits/stdc++.h>
 
using namespace std;
 
/*
se p dois intervalos [a,b] a cobre b, ent a e b tem que ter tipos diferentes
resposta válida tem que ter alguem que cobre outro
ignorar os cobertos
pensar no círculo
vendo os independentes posso colocar eles de cores diferentes pra aproveitar interseções
parte com eles sozinhos tem que ter intervalos contidos bons
qnt par deles fechou
*/
 
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> f[MAXN][2]; // {start, end} fios
pii cb[MAXN];
bool ty[MAXN];
bool ind[MAXN], iscy[MAXN];  // se é independente, ciclo

int pai[MAXN]; // pros ruins, quem contem ele

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    // cout << fixed << setprecision(7);
 
    int n, m;
    cin >> n >> m;
 
    int a, b, cyd=0, cyl=1e9+1;

    vector<pair<pii, int>> ord, cy;

    for (int i=0;i<m;i++){
        cin >> a >> b;
        cb[i] = {a,b}, pai[i]=-1;
        if(b<a){
            if (b==a-1){
                a=1,b=n;
                cb[i]={a,b};
            }else{
                cyd = max(cyd, b), cyl = min(cyl, a), iscy[i]=1;
                cy.push_back({{a,-b}, i});
                f[1][0].push_back(i);
                f[b][1].push_back(i);
                f[a][0].push_back(i);
                continue;
            }
        }
        ord.push_back({{a,-b}, i});
        f[a][0].push_back(i);
        f[b][1].push_back(i);
    }
    if (!ord.empty()) sort(ord.begin(), ord.end());
    bool ruim = 0;
    for (auto &x:ord){
        x.first.second = -x.first.second;
        if (x.first.second <= cyd) continue;
        if (x.first.first >= cyl) break;
        cyd = x.first.second, ind[x.second]=1, ruim^=1;
    }

    if (!ord.empty() && ord[0].first.first == 1 && ord[0].first.second==n) ruim=0;  // se tem um cara que cobre todo mundo ou nn tem ciclos
    else{  // ver ciclos
        sort(cy.begin(), cy.end());
        cyd = 0;
        for (auto &x:cy){
            x.first.second*=-1;
            if (x.first.second<=cyd) continue;
            cyd=x.first.second, ind[x.second]=1, ruim^=1;
        }
    }

    ord.clear();
    cy.clear();

    set<int> all, im;
    vector<int> bn;  // bons (ciclos aparecem só no final)
    int lst=0;
    map<pii, bool> valid;
    for (int i=1;i<=n;i++){
        for (auto &u:f[i][0]) if (ind[u]){
            if (!iscy[u] || i>=cyl) bn.push_back(u);
            im.insert(u);
            lst = u;
        }
        while (!f[i][0].empty()){
            int u = f[i][0].back();
            f[i][0].pop_back();
            if (ind[u]) continue;
            all.insert(u);
            pai[u] = lst;  // se um ruim cobre um trecho sem importantes ent ele deveria ser importante
        }

        if (im.size()+all.size()<2){
            cout << "impossible\n";
            return 0;
        }

        if (im.size()==2){
            pii srch = {*im.begin(), *next(im.begin())};
            if (!valid.count(srch)) valid[srch] = 1;
            if (all.empty()) valid[srch] = 0;
        }

        while (!f[i][1].empty()){
            int u = f[i][1].back();
            f[i][1].pop_back();
            if (ind[u]) im.erase(u);
            else all.erase(u);
        }
    }

    pii want = {-1,-1};
    for (auto &x:valid) if (x.second){
        want = x.first;
        break;
    }

    if (want.first==-1){  // pegar não-interseção
        lst = bn.back();
        for (int i=0;i<bn.size();i++){
            int l = cb[bn[i]].first, r=cb[bn[i]].second;

            if (l>cyd){
                want = {bn[i], lst};
                // cerr << bn[i] << ' ' << lst << ' ' << " for " << cyd << '\n';
                break;
            }

            if (l<=r) cyd=cb[bn[i]].second;
            else cyd=n;
        }
    }

    if (ruim && want.first==-1){  // quantidade é ímpar e não tem uma interseção que é válida nem um cara que cobre todo mundo
        cout << "impossible\n";
        return 0;
    }

    int sz = bn.size();
    if (!ruim){
        ty[bn[0]]=1;
        for (int i=1;i<sz;i++) ty[bn[i]] = !ty[bn[i-1]];
    }else{
        int st = -1;
        for (int i=0;i<sz;i++){
            if (bn[i]==want.first || bn[i]==want.second){
                if (bn[i]==want.first) want.first = i;
                else want.second=i;

            }
        }
        if (want.second<want.first) swap(want.first, want.second);
        bool color = 1;

        for (int i=want.second;i<sz;i++){
            ty[bn[i]] = color, color=!color;
        }
        for (int i=0;i<=want.first;i++){
            ty[bn[i]] = color, color=!color;
        }
        
    }

    for (int i=0;i<m;i++){
        if (pai[i] == -1) cout << ty[i];
        else cout << !ty[pai[i]];
    }
    cout << '\n';
 
    return 0;
}

Compilation message

alternating.cpp: In function 'int main()':
alternating.cpp:128:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  128 |         for (int i=0;i<bn.size();i++){
      |                      ~^~~~~~~~~~
alternating.cpp:152:13: warning: unused variable 'st' [-Wunused-variable]
  152 |         int st = -1;
      |             ^~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6224 KB Output is correct
2 Correct 3 ms 6224 KB Output is correct
3 Incorrect 2 ms 6224 KB 'impossible' claimed, but there is a solution
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6224 KB Output is correct
2 Correct 3 ms 6224 KB Output is correct
3 Incorrect 2 ms 6224 KB 'impossible' claimed, but there is a solution
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6224 KB Output is correct
2 Correct 3 ms 6224 KB Output is correct
3 Incorrect 2 ms 6224 KB 'impossible' claimed, but there is a solution
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 43 ms 13296 KB Output is correct
2 Correct 3 ms 6224 KB Output is correct
3 Correct 14 ms 10248 KB Output is correct
4 Correct 25 ms 12552 KB Output is correct
5 Correct 50 ms 13396 KB Output is correct
6 Correct 38 ms 12284 KB Output is correct
7 Incorrect 39 ms 13060 KB no wires in direction 1 between segments 10645 and 10645
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 6224 KB Output is correct
2 Correct 3 ms 6224 KB Output is correct
3 Incorrect 2 ms 6224 KB 'impossible' claimed, but there is a solution
4 Halted 0 ms 0 KB -