제출 #280334

#제출 시각아이디문제언어결과실행 시간메모리
280334eohomegrownappsParachute rings (IOI12_rings)C++14
100 / 100
2124 ms152404 KiB
#include <bits/stdc++.h>
using namespace std;

int n;

struct UFDS{
    int n;
    vector<int> parent;
    vector<int> edges;
    vector<int> vertices;
    vector<int> vcnt;
    int numCycles = 0;
    int cycleVertices = 0;
    bool isLinear;

    UFDS(int _n){
        n=_n;
        parent.resize(n);
        edges.resize(n,0);
        vertices.resize(n,1);
        vcnt.resize(n,0);
        isLinear = true;
        for (int i = 0; i<n; i++){
            parent[i]=i;
        }
    }

    int root(int x){
        if (x==parent[x]){return x;}
        return parent[x]=root(parent[x]);
    }

    void connect(int a, int b){
        vcnt[a]++;
        vcnt[b]++;
        if (vcnt[a]>2||vcnt[b]>2){isLinear = false;}
        int ra = root(a);
        int rb = root(b);
        if (ra!=rb){
            //rb is new root
            parent[ra]=rb;
            vertices[rb]+=vertices[ra];
            edges[rb]+=edges[ra]+1;
        } else {
            //todo: what happens if we connect in existing cycle
            edges[ra]++;
            numCycles++;
            isLinear = false;
            cycleVertices+=vertices[rb];
        }
    }

    bool connected(int a, int b){
        return root(a)==root(a);
    }

    int getEdges(int x){
        return edges[root(x)];
    }

    int getVertices(int x){
        return vertices[root(x)];
    }
};

vector<vector<int>> adjlist;

vector<UFDS> threeormore;
vector<int> nodesremove;

UFDS mainufds(0);

int numcritical;

vector<pair<int,int>> links;

void Init(int N_) {
    n = N_;
    adjlist.resize(n);
    mainufds = UFDS(n);
    numcritical = n;
}

void Link(int a, int b) {
    if (threeormore.size()>0){
        //just check all four
        numcritical = 0;
        for (int i = 0; i<threeormore.size(); i++){
            if (!(nodesremove[i]==a||nodesremove[i]==b)){
                threeormore[i].connect(a,b);
            }
            if (threeormore[i].isLinear){
                //cout<<i<<' '<<a<<' '<<b<<' '<<'\n';
                numcritical++;
            }
        }
    } else {
        //have we just made three things
        if (adjlist[a].size()!=2&&adjlist[b].size()==2){
            swap(a,b);
        }
        if (adjlist[a].size()==2){
            //vector<int> nodesremove;
            nodesremove.push_back(a);
            for (int i : adjlist[a]){
                nodesremove.push_back(i);
            }
            nodesremove.push_back(b);
            //make new ufds without these nodes
            for (int i = 0; i<4; i++){
                threeormore.push_back(UFDS(n));
                for (auto l : links){
                    if (l.first==nodesremove[i]||l.second==nodesremove[i]){continue;}
                    threeormore[i].connect(l.first, l.second);
                }
            }
            Link(a,b);
            return;
        } else {
            links.push_back({a,b});
            mainufds.connect(a,b);
            adjlist[a].push_back(b);
            adjlist[b].push_back(a);
            if (mainufds.numCycles==0){
                numcritical = n;
            } else if (mainufds.numCycles==1){
                numcritical = mainufds.cycleVertices;
            } else {
                numcritical = 0;
            }
        }
    }
}

int CountCritical() {
    return numcritical;
}

컴파일 시 표준 에러 (stderr) 메시지

rings.cpp: In function 'void Link(int, int)':
rings.cpp:88:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<UFDS>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |         for (int i = 0; i<threeormore.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...