답안 #49507

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
49507 2018-05-30T06:17:57 Z ho94949 낙하산 고리들 (IOI12_rings) C++17
0 / 100
1043 ms 81664 KB
#include<vector>
#include<algorithm>
using namespace std;

const int MAXN = 1010101;

struct UF
{
    int N;
    int ufd[MAXN];
    UF(){}
    UF(int n):N(n)
    {
        for(int i=0; i<n; ++i) ufd[i] = i;
    }
    int Find(int a)
    {
        if(a==ufd[a]) return a;
        return ufd[a] = Find(ufd[a]);
    }
    bool Union(int a, int b)
    {
        a = Find(a); b = Find(b);
        if(a==b) return false;
        ufd[a] = b; return true;
    }
};

struct DAT
{
    int N; UF uf; int numcyc; int cyclen;
    DAT(){};
    DAT(int n): N(n), uf(n), numcyc(0), cyclen(0){}
    void Add(int a, int b)
    {
        if(!uf.Union(a, b)) 
            if(++numcyc == 1)
                for(int i=0; i<N; ++i)
                    if(uf.Find(i) == uf.Find(a))
                        ++cyclen;
    }
};
enum PHASE {DEG2, DEG3_1, DEG3_2, DEG3_3, SP1, INF};
PHASE state;

DAT global;


int N, M;
pair<int, int> EList[MAXN];
vector<int> conn[MAXN];
int deg[MAXN], numdeg[5];

vector<int> specials;
vector<DAT> datas;

void Init(int _N) {
    N = _N; M = 0; numdeg[0] = N;
    DAT d(N); global = d;
    state = DEG2;
}
void updatespecials()
{
    for(auto x: specials)
    {
        DAT d(N);
        for(int i=0; i<M; ++i)
        {
            if(EList[i].first == x || EList[i].second == x) continue;
            d.Add(EList[i].first, EList[i].second);
        }
        datas.push_back(d);
    }
}
void makestate(PHASE state)
{
    specials.clear(); datas.clear();
    switch(state)
    {
        case DEG2: case INF: return;
        case DEG3_1: 
            for(int i=0; i<N; ++i)
                if(deg[i] == 3)
                {
                    specials.push_back(i);
                    for(auto x: conn[i])
                        specials.push_back(x);
                }
            break;
        case DEG3_2:
        case DEG3_3: 
            for(int i=0; i<N; ++i)
                if(deg[i] == 3)
                    specials.push_back(i);
            break;
        case SP1: 
            for(int i=0; i<N; ++i)
                if(deg[i] >= 3)
                {
                    bool f = true;
                    for(auto x: conn[i])
                        if(deg[x] < 3) f = false;
                    if(f) specials.push_back(i);
                }
            break;
    }
    updatespecials();
}

void updatestate(PHASE state, int A, int B)
{
    switch(state)
    {
        case DEG2:
            global.Add(A, B);
            break;
        default:
            for(int i=0; i<specials.size(); ++i)
            {
                if(specials[i] == A || specials[i] == B) continue;
                datas[i].Add(A, B);
            }
            break;
    }
}

void Link(int A, int B) {
    if(state == INF) return;
    EList[M++] = make_pair(A, B);
    numdeg[min(4, deg[A])]--; numdeg[min(4, deg[B])]--;
    deg[A]++; deg[B]++;
    numdeg[min(4, deg[A])]++; numdeg[min(4, deg[B])]++;
    conn[A].push_back(B);
    conn[B].push_back(A);
    
    PHASE newstate = DEG2;
    if(numdeg[4] >= 2){ state = INF; return;}
    else if(numdeg[4] == 1 || numdeg[3] >= 4) newstate = SP1;
    else if(numdeg[3] == 3) newstate = DEG3_3;
    else if(numdeg[3] == 2) newstate = DEG3_2;
    else if(numdeg[3] == 1) newstate = DEG3_1;
    else newstate = DEG2;
    if(state != newstate)
    {
        state = newstate;
        makestate(state);
    }
    else updatestate(state, A, B);
}
int CountCritical() {
    //if(state == DEG2) puts("DEG2");
    //printf(">%d %d\n", state, (int)datas.size());
    int ans = 0;
    switch(state)
    {
    case DEG2:
        switch(global.numcyc)
        {
            case 0: return N;
            case 1: return global.cyclen;
            default: return 0;
        }
    case INF:
        return 0;
    default:
        for(const auto& x: datas)
            if(x.numcyc==0) ++ans;
        return ans;
    }
}







Compilation message

rings.cpp: In function 'void updatestate(PHASE, int, int)':
rings.cpp:118:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i=0; i<specials.size(); ++i)
                          ~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 28024 KB Output is correct
2 Incorrect 46 ms 48004 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 568 ms 52556 KB Output is correct
2 Incorrect 1043 ms 81664 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 28024 KB Output is correct
2 Incorrect 46 ms 48004 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 28024 KB Output is correct
2 Incorrect 46 ms 48004 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 28024 KB Output is correct
2 Incorrect 46 ms 48004 KB Output isn't correct
3 Halted 0 ms 0 KB -