Submission #68721

#TimeUsernameProblemLanguageResultExecution timeMemory
68721AbelyanParachute rings (IOI12_rings)C++17
0 / 100
4048 ms171284 KiB

#include <bits/stdc++.h>
using namespace std;


const int N=1000006;
int p[12][N],sz[12][N],deg[12][N],degcn[12][N],n,comp[12],qanak;
vector<int> g[N],d3;
bool no=false,col[N],cnch[N];

int get_par(int v,int k){
    if (p[k][v]==v)return v;
    return p[k][v]=get_par(p[k][v],k);
}

void unite (int a,int b,int k=0){
    a=get_par(a,k);
    b=get_par(b,k);
    if (a!=b){
        comp[k]--;
        if (sz[k][b]>sz[k][a])swap(a,b);
        p[k][b]=a;
        sz[k][a]+=sz[k][b];
    }
}

void Init(int N_) {
    n=N_;
    degcn[0][0]=n;
    comp[0]=n;
    for (int i=0;i<n;i++){
        p[0][i]=i;
        sz[0][i]=1;
    }
}


void make_dsu(int b,int k){
    comp[k]=n-1;
    for (int i=0;i<n;i++){
        p[k][i]=i;
        sz[k][i]=i;
    }
    for (int i=0;i<n;i++){
        if (i==b)continue;
        for (int j=0;j<g[i].size();j++){
            if (g[i][j]==b)continue;
            unite(i,g[i][j],k);
            deg[k][i]++;
            deg[k][g[i][j]]++;
            //if (b==1)
            //cout<<"hi "<<deg[k][i]<<" "<<deg[k][g[i][j]]<<" "<<i<<" "<<g[i][j]<<endl;
        }
    }
    for (int i=0;i<n;i++){
        deg[k][i]/=2;
        if (i==b)continue;
        degcn[k][deg[k][i]]++;
        //cout<<k<<" "<<degcn[k][deg[k][i]]<<" ";
    }
    //cout<<endl;
}

void Link(int a, int b) {
    //if (no) return;
    g[a].push_back(b);
    g[b].push_back(a);
    deg[0][a]++;
    deg[0][b]++;
    degcn[0][deg[0][a]-1]--;
    degcn[0][deg[0][b]-1]--;
    degcn[0][deg[0][a]]++;
    degcn[0][deg[0][b]]++;
    unite(a,b);
    vector<int> v;
    if (deg[0][a]==3 && qanak<=4){
        qanak++;
        if (!col[a]){
            col[a]=true;
            d3.push_back(a);
            make_dsu(a,d3.size());
            v.push_back(d3.size());
            cnch[d3.size()]=true;
        }
        if (qanak<=2){
            for (int i=0;i<g[a].size();i++){
                if (col[g[a][i]])continue;
                //cout<<g[a][i]<<" ";
                col[g[a][i]]=true;
                d3.push_back(g[a][i]);
                v.push_back(d3.size());
                cnch[d3.size()]=true;
                make_dsu(g[a][i],d3.size());
            }
            //cout<<endl;
        }
    }
    if (deg[0][b]==3 && qanak<=4){
        qanak++;
        if (qanak==5){
            no=true;
            return;
        }
        if (!col[b]){
            col[b]=true;
            d3.push_back(b);
            make_dsu(b,d3.size());
            v.push_back(d3.size());
            cnch[d3.size()]=true;
        }
        if (qanak<=2){
            for (int i=0;i<g[b].size();i++){
                if (col[g[b][i]])continue;
                //cout<<g[b][i]<<" ";
                col[g[b][i]]=true;
                d3.push_back(g[b][i]);
                //cout<<d3.size()<<" ";
                v.push_back(d3.size());
                cnch[d3.size()]=true;
                make_dsu(g[b][i],d3.size());
            }
            //cout<<endl;
        }
    }

    for (int i=0;i<d3.size();i++){
        i++;
        if (a==d3[i-1] || b==d3[i-1] || cnch[i])
        {
            i--;
            continue;
        }
        deg[i][a]++;
        deg[i][b]++;
        degcn[i][deg[i][a]-1]--;
        degcn[i][deg[i][b]-1]--;
        degcn[i][deg[i][a]]++;
        degcn[i][deg[i][b]]++;
        unite(a,b,i);
        i--;
    }
    for (int i=0;i<v.size();i++)cnch[v[i]]=false;
    //cout<<d3.size()<<endl;
}

int CountCritical() {
    //if (no)return 0;
    if (d3.size()==0){
        if (degcn[0][0]+degcn[0][1]/2==comp[0]) return n;
        return 0;
    }
    int ans=0;
    //cout<<d3.size()<<endl;
    for (int i=0;i<d3.size();i++){
        //cout<<d3[i]<<" "<<degcn[i+1][2]<<" "<<degcn[i+1][1]<<" "<<degcn[i+1][0]<<endl;
        if (degcn[i+1][2]+degcn[i+1][1]+degcn[i+1][0]!=n-1)continue;
        if (degcn[i+1][0]+degcn[i+1][1]/2==comp[i+1]){

            ans++;
        }
    }
    //cout<<endl;
    return ans;
}

Compilation message (stderr)

rings.cpp: In function 'void make_dsu(int, int)':
rings.cpp:46:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j=0;j<g[i].size();j++){
                      ~^~~~~~~~~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:86:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int i=0;i<g[a].size();i++){
                          ~^~~~~~~~~~~~
rings.cpp:112:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int i=0;i<g[b].size();i++){
                          ~^~~~~~~~~~~~
rings.cpp:126:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0;i<d3.size();i++){
                  ~^~~~~~~~~~
rings.cpp:142:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0;i<v.size();i++)cnch[v[i]]=false;
                  ~^~~~~~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:154:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0;i<d3.size();i++){
                  ~^~~~~~~~~~
#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...