답안 #254659

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
254659 2020-07-30T12:08:10 Z MKopchev 낙하산 고리들 (IOI12_rings) C++14
100 / 100
1640 ms 109432 KB
#include<bits/stdc++.h>
using namespace std;

const int nmax=1e6+42;

int n;

int deg[10][nmax];

int ret;

vector< int > adj[nmax];

int parent[10][nmax];
int SZ[nmax];

void Init(int N)
{
    n=N;

    ret=n;

    for(int i=0;i<n;i++)
    {
        parent[0][i]=i;
        SZ[i]=1;
    }
}

set<int> big;

bool forced_small_group=0;

int root(int id,int node)
{
    if(parent[id][node]==node)return parent[id][node];
    parent[id][node]=root(id,parent[id][node]);
    return parent[id][node];
}

bool cycle;

vector< pair<int,int> > edges;

set<int> nums;

int ordered[10],pointer=0;
bool valid[10];

void small_group(int A,int B)
{
    //cout<<"small group "<<A<<" "<<B<<endl;

    for(int i=1;i<=pointer;i++)
        if(valid[i]&&A!=ordered[i]&&B!=ordered[i])
        {
            deg[i][A]++;
            deg[i][B]++;

            if(root(i,A)==root(i,B)||deg[i][A]>=3||deg[i][B]>=3)
            {
                valid[i]=0;
                ret--;
                continue;
            }

            parent[i][root(i,A)]=root(i,B);
        }

    //for(int i=1;i<=pointer;i++)cout<<ordered[i]<<" "<<valid[i]<<endl;
}
void create_small()
{
    for(auto k:big)
    {
        nums.insert(k);
        for(auto p:adj[k])
            nums.insert(p);
    }

    ret=0;
    for(auto k:nums)
    {
        pointer++;
        ordered[pointer]=k;
        valid[pointer]=1;
        ret++;

        for(int j=0;j<n;j++)
            parent[pointer][j]=j;

        //cout<<"k= "<<k<<endl;
    }

    for(auto k:edges)
        small_group(k.first,k.second);
}

void Link(int A, int B)
{
    edges.push_back({A,B});

    adj[A].push_back(B);
    adj[B].push_back(A);

    if(ret==0)return;

    if(forced_small_group)
    {
        small_group(A,B);
        return;
    }

    deg[0][A]++;
    deg[0][B]++;

    if(deg[0][A]>=3)big.insert(A);
    if(deg[0][B]>=3)big.insert(B);

    if(big.size()>=1)
    {
        forced_small_group=1;
        create_small();
        return;
    }

    if(root(0,A)!=root(0,B))
    {
        SZ[root(0,B)]+=SZ[root(0,A)];
        parent[0][root(0,A)]=root(0,B);
        return;
    }

    //a cycle with no degrees >=3
    if(cycle)
    {
        ret=0;
        return;
    }

    //for(int i=0;i<n;i++)cout<<root(0,i)<<" "<<SZ[i]<<endl;

    cycle=1;
    ret=SZ[root(0,A)];
}
int CountCritical()
{
    return ret;
}
/*
int main()
{

    Init(7);
    cout<<CountCritical()<<endl;//7
    Link(1, 2);
    cout<<CountCritical()<<endl;//7
    Link(0, 5);
    cout<<CountCritical()<<endl;//7
    Link(2, 0);
    cout<<CountCritical()<<endl;//7
    Link(3, 2);
    cout<<CountCritical()<<endl;//4
    Link(3, 5);
    cout<<CountCritical()<<endl;//3
    Link(4, 3);
    cout<<CountCritical()<<endl;//2

    Init(7);
    cout<<CountCritical()<<endl;//7
    Link(0,1);
    cout<<CountCritical()<<endl;//7
    Link(1,2);
    cout<<CountCritical()<<endl;//7
    Link(2,0);
    cout<<CountCritical()<<endl;//3

    Link(3,4);
    cout<<CountCritical()<<endl;//3
    Link(4,5);
    cout<<CountCritical()<<endl;//3
    Link(5,3);
    cout<<CountCritical()<<endl;//0


    return 0;
}
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23808 KB Output is correct
2 Correct 21 ms 24320 KB Output is correct
3 Correct 16 ms 24320 KB Output is correct
4 Correct 14 ms 23936 KB Output is correct
5 Correct 15 ms 24064 KB Output is correct
6 Correct 16 ms 24192 KB Output is correct
7 Correct 14 ms 24320 KB Output is correct
8 Correct 15 ms 24064 KB Output is correct
9 Correct 17 ms 24448 KB Output is correct
10 Correct 18 ms 24448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 494 ms 50268 KB Output is correct
2 Correct 1060 ms 89556 KB Output is correct
3 Correct 930 ms 101584 KB Output is correct
4 Correct 1471 ms 74708 KB Output is correct
5 Correct 1538 ms 78236 KB Output is correct
6 Correct 1254 ms 77008 KB Output is correct
7 Correct 862 ms 104144 KB Output is correct
8 Correct 1543 ms 104400 KB Output is correct
9 Correct 1640 ms 109432 KB Output is correct
10 Correct 878 ms 75972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23808 KB Output is correct
2 Correct 21 ms 24320 KB Output is correct
3 Correct 16 ms 24320 KB Output is correct
4 Correct 14 ms 23936 KB Output is correct
5 Correct 15 ms 24064 KB Output is correct
6 Correct 16 ms 24192 KB Output is correct
7 Correct 14 ms 24320 KB Output is correct
8 Correct 15 ms 24064 KB Output is correct
9 Correct 17 ms 24448 KB Output is correct
10 Correct 18 ms 24448 KB Output is correct
11 Correct 16 ms 24448 KB Output is correct
12 Correct 19 ms 24832 KB Output is correct
13 Correct 18 ms 24832 KB Output is correct
14 Correct 26 ms 24832 KB Output is correct
15 Correct 20 ms 24832 KB Output is correct
16 Correct 21 ms 24448 KB Output is correct
17 Correct 18 ms 24952 KB Output is correct
18 Correct 19 ms 25472 KB Output is correct
19 Correct 19 ms 24576 KB Output is correct
20 Correct 20 ms 24960 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23808 KB Output is correct
2 Correct 21 ms 24320 KB Output is correct
3 Correct 16 ms 24320 KB Output is correct
4 Correct 14 ms 23936 KB Output is correct
5 Correct 15 ms 24064 KB Output is correct
6 Correct 16 ms 24192 KB Output is correct
7 Correct 14 ms 24320 KB Output is correct
8 Correct 15 ms 24064 KB Output is correct
9 Correct 17 ms 24448 KB Output is correct
10 Correct 18 ms 24448 KB Output is correct
11 Correct 16 ms 24448 KB Output is correct
12 Correct 19 ms 24832 KB Output is correct
13 Correct 18 ms 24832 KB Output is correct
14 Correct 26 ms 24832 KB Output is correct
15 Correct 20 ms 24832 KB Output is correct
16 Correct 21 ms 24448 KB Output is correct
17 Correct 18 ms 24952 KB Output is correct
18 Correct 19 ms 25472 KB Output is correct
19 Correct 19 ms 24576 KB Output is correct
20 Correct 20 ms 24960 KB Output is correct
21 Correct 34 ms 26104 KB Output is correct
22 Correct 47 ms 27252 KB Output is correct
23 Correct 60 ms 28272 KB Output is correct
24 Correct 70 ms 29296 KB Output is correct
25 Correct 28 ms 27640 KB Output is correct
26 Correct 69 ms 31472 KB Output is correct
27 Correct 78 ms 29292 KB Output is correct
28 Correct 71 ms 32236 KB Output is correct
29 Correct 53 ms 30580 KB Output is correct
30 Correct 106 ms 30056 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23808 KB Output is correct
2 Correct 21 ms 24320 KB Output is correct
3 Correct 16 ms 24320 KB Output is correct
4 Correct 14 ms 23936 KB Output is correct
5 Correct 15 ms 24064 KB Output is correct
6 Correct 16 ms 24192 KB Output is correct
7 Correct 14 ms 24320 KB Output is correct
8 Correct 15 ms 24064 KB Output is correct
9 Correct 17 ms 24448 KB Output is correct
10 Correct 18 ms 24448 KB Output is correct
11 Correct 494 ms 50268 KB Output is correct
12 Correct 1060 ms 89556 KB Output is correct
13 Correct 930 ms 101584 KB Output is correct
14 Correct 1471 ms 74708 KB Output is correct
15 Correct 1538 ms 78236 KB Output is correct
16 Correct 1254 ms 77008 KB Output is correct
17 Correct 862 ms 104144 KB Output is correct
18 Correct 1543 ms 104400 KB Output is correct
19 Correct 1640 ms 109432 KB Output is correct
20 Correct 878 ms 75972 KB Output is correct
21 Correct 16 ms 24448 KB Output is correct
22 Correct 19 ms 24832 KB Output is correct
23 Correct 18 ms 24832 KB Output is correct
24 Correct 26 ms 24832 KB Output is correct
25 Correct 20 ms 24832 KB Output is correct
26 Correct 21 ms 24448 KB Output is correct
27 Correct 18 ms 24952 KB Output is correct
28 Correct 19 ms 25472 KB Output is correct
29 Correct 19 ms 24576 KB Output is correct
30 Correct 20 ms 24960 KB Output is correct
31 Correct 34 ms 26104 KB Output is correct
32 Correct 47 ms 27252 KB Output is correct
33 Correct 60 ms 28272 KB Output is correct
34 Correct 70 ms 29296 KB Output is correct
35 Correct 28 ms 27640 KB Output is correct
36 Correct 69 ms 31472 KB Output is correct
37 Correct 78 ms 29292 KB Output is correct
38 Correct 71 ms 32236 KB Output is correct
39 Correct 53 ms 30580 KB Output is correct
40 Correct 106 ms 30056 KB Output is correct
41 Correct 292 ms 43364 KB Output is correct
42 Correct 663 ms 82924 KB Output is correct
43 Correct 269 ms 58352 KB Output is correct
44 Correct 643 ms 102100 KB Output is correct
45 Correct 703 ms 97684 KB Output is correct
46 Correct 922 ms 70080 KB Output is correct
47 Correct 1116 ms 70760 KB Output is correct
48 Correct 593 ms 89436 KB Output is correct
49 Correct 806 ms 70308 KB Output is correct
50 Correct 854 ms 69844 KB Output is correct
51 Correct 307 ms 66156 KB Output is correct
52 Correct 564 ms 87900 KB Output is correct
53 Correct 463 ms 90220 KB Output is correct
54 Correct 1176 ms 94208 KB Output is correct
55 Correct 1054 ms 99792 KB Output is correct