답안 #907528

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
907528 2024-01-15T20:07:20 Z JakobZorz 낙하산 고리들 (IOI12_rings) C++17
37 / 100
1248 ms 126532 KB
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;

int n;
vector<int>nodes[(int)1e6];
unordered_set<int>num3;
int num4=-1;
int num3n[(int)1e6];
int num_cycles;
unordered_set<int>cycle;

int dsu_has_cycle[(int)1e6];
int dsu_parent[(int)1e6];
int dsu_get(int a){
    if(dsu_parent[a]<0)
        return a;
    return dsu_parent[a]=dsu_get(dsu_parent[a]);
}

void dsu_merge(int a,int b){
    a=dsu_get(a);
    b=dsu_get(b);
    if(a==b)
        return;
    if(dsu_parent[a]>dsu_parent[b])
        swap(a,b);
    dsu_parent[a]+=dsu_parent[b];
    dsu_has_cycle[a]=max(dsu_has_cycle[a],dsu_has_cycle[b]);
    dsu_parent[b]=a;
}

void Init(int N){
    n=N;
    for(int i=0;i<1e6;i++)
        dsu_parent[i]=-1;
}

int cvis;
int vis[(int)1e6];
int dfs(int node,int d,int end){ // -1 = dead end
    int pv=vis[node];
    vis[node]=cvis;
    
    for(int ne:nodes[node]){
        if(ne==end&&d>1)
            return end;
        if(vis[ne]!=cvis&&vis[ne]!=0)
            return ne;
            
        if(vis[ne]==0){
            int r=dfs(ne,d+1,end);
            if(r!=-1)
                return r;
        }
    }
    
    vis[node]=pv;
    return -1;
}

void conn(int a,int b){
    nodes[a].push_back(b);
    if(nodes[a].size()==3){
        num3.insert(a);
        for(int ne:nodes[a])
            num3n[ne]++;
    }
    
    if(nodes[a].size()==4){
        num3.erase(a);
        if(num4==-1)
            num4=a;
        else
            num4=-2;
        for(int ne:nodes[a])
            num3n[ne]--;
    }
}

void Link(int a,int b){
    conn(a,b);
    conn(b,a);
    
    if(dsu_get(a)==dsu_get(b)){
        if(num_cycles==0){
            cvis++;
            dfs(a,0,a);
            //cout<<"cycle: ";
            for(int i=0;i<1e6;i++)
                if(vis[i]==cvis){
                    cycle.insert(i);
                    //cout<<i<<" ";
                }
            //cout<<"\n";
            num_cycles=1;
            dsu_has_cycle[dsu_get(a)]=1;
        }else if(num_cycles==1){
            if(dsu_has_cycle[dsu_get(a)]==0)
                num_cycles=2;
            else{
                unordered_set<int>s;
                for(int ne:nodes[a]){
                    cvis++;
                    int r=dfs(a,0,a);
                    if(r!=-1)
                        s.insert(r);
                }
                
                if(s.size()!=1){
                    num_cycles=2;
                }else{
                    int center=*s.begin();
                    if(cycle.count(center))
                        cycle={center};
                    else
                        num_cycles=2;
                }
            }
        }else{
            num_cycles=2;
        }
    }else{
        dsu_merge(a,b);
    }
}

bool check(int i){
    bool in_cycle=true;
    if(num_cycles==1)
        in_cycle=cycle.count(i);
    return (num3n[i]==(int)num3.size()||(nodes[i].size()==3&&num3n[i]==(int)num3.size()-1))&&in_cycle;
}

int CountCritical(){
    if(num_cycles>=2)
        return 0;
    if(num3.size()>4)
        return 0;
    if(num4==-2)
        return 0;
    if(num4!=-1){
        bool in_cycle=true;
        if(num_cycles==1)
            in_cycle=cycle.count(num4);
        return num3n[num4]==num3.size()&&in_cycle;
    }
    
    if(num3.empty()&&num_cycles==1)
        return cycle.size();
    
    if(num3.empty())
        return n;
    
    int res=0;
    unordered_set<int>s;
    for(int i:num3){
        for(int ne:nodes[i]){
            if(check(ne))
                s.insert(ne);
        }
        if(check(i))
            s.insert(i);
    }
    return (int)s.size();
}

Compilation message

rings.cpp: In function 'void Link(int, int)':
rings.cpp:104:25: warning: unused variable 'ne' [-Wunused-variable]
  104 |                 for(int ne:nodes[a]){
      |                         ^~
rings.cpp: In function 'int CountCritical()':
rings.cpp:147:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::unordered_set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |         return num3n[num4]==num3.size()&&in_cycle;
      |                ~~~~~~~~~~~^~~~~~~~~~~~~
rings.cpp:156:9: warning: unused variable 'res' [-Wunused-variable]
  156 |     int res=0;
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 10 ms 33372 KB Output is correct
3 Correct 12 ms 33224 KB Output is correct
4 Correct 10 ms 33116 KB Output is correct
5 Correct 13 ms 33368 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 11 ms 33424 KB Output is correct
9 Correct 11 ms 33372 KB Output is correct
10 Correct 12 ms 33372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 267 ms 50940 KB Output is correct
2 Correct 794 ms 62252 KB Output is correct
3 Correct 1164 ms 71788 KB Output is correct
4 Correct 928 ms 67452 KB Output is correct
5 Correct 985 ms 71044 KB Output is correct
6 Correct 1248 ms 126532 KB Output is correct
7 Correct 1204 ms 72616 KB Output is correct
8 Correct 907 ms 66644 KB Output is correct
9 Correct 981 ms 68400 KB Output is correct
10 Correct 648 ms 63928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 10 ms 33372 KB Output is correct
3 Correct 12 ms 33224 KB Output is correct
4 Correct 10 ms 33116 KB Output is correct
5 Correct 13 ms 33368 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 11 ms 33424 KB Output is correct
9 Correct 11 ms 33372 KB Output is correct
10 Correct 12 ms 33372 KB Output is correct
11 Incorrect 12 ms 33368 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 10 ms 33372 KB Output is correct
3 Correct 12 ms 33224 KB Output is correct
4 Correct 10 ms 33116 KB Output is correct
5 Correct 13 ms 33368 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 11 ms 33424 KB Output is correct
9 Correct 11 ms 33372 KB Output is correct
10 Correct 12 ms 33372 KB Output is correct
11 Incorrect 12 ms 33368 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 10 ms 33372 KB Output is correct
3 Correct 12 ms 33224 KB Output is correct
4 Correct 10 ms 33116 KB Output is correct
5 Correct 13 ms 33368 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 11 ms 33424 KB Output is correct
9 Correct 11 ms 33372 KB Output is correct
10 Correct 12 ms 33372 KB Output is correct
11 Correct 267 ms 50940 KB Output is correct
12 Correct 794 ms 62252 KB Output is correct
13 Correct 1164 ms 71788 KB Output is correct
14 Correct 928 ms 67452 KB Output is correct
15 Correct 985 ms 71044 KB Output is correct
16 Correct 1248 ms 126532 KB Output is correct
17 Correct 1204 ms 72616 KB Output is correct
18 Correct 907 ms 66644 KB Output is correct
19 Correct 981 ms 68400 KB Output is correct
20 Correct 648 ms 63928 KB Output is correct
21 Incorrect 12 ms 33368 KB Output isn't correct
22 Halted 0 ms 0 KB -