Submission #907546

# Submission time Handle Problem Language Result Execution time Memory
907546 2024-01-15T20:37:24 Z JakobZorz Parachute rings (IOI12_rings) C++17
37 / 100
1090 ms 122568 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_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_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);
            for(int i=0;i<1e6;i++)
                if(vis[i]==cvis){
                    cycle.insert(i);
                }
            num_cycles=1;
        }else if(num_cycles==1){
            unordered_set<int>s;
            int cnt=0;
            for(int ne:nodes[a]){
                cvis++;
                int r=dfs(a,0,a);
                if(r!=-1){
                    s.insert(r);
                    cnt++;
                }
            }
            
            if(s.size()!=1||cnt==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:96:21: warning: unused variable 'ne' [-Wunused-variable]
   96 |             for(int ne:nodes[a]){
      |                     ^~
rings.cpp: In function 'int CountCritical()':
rings.cpp:140:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::unordered_set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |         return num3n[num4]==num3.size()&&in_cycle;
      |                ~~~~~~~~~~~^~~~~~~~~~~~~
rings.cpp:149:9: warning: unused variable 'res' [-Wunused-variable]
  149 |     int res=0;
      |         ^~~
# Verdict Execution time Memory Grader output
1 Correct 9 ms 31324 KB Output is correct
2 Correct 10 ms 31368 KB Output is correct
3 Correct 11 ms 31424 KB Output is correct
4 Correct 10 ms 31440 KB Output is correct
5 Correct 11 ms 31576 KB Output is correct
6 Correct 12 ms 31832 KB Output is correct
7 Correct 10 ms 31320 KB Output is correct
8 Correct 11 ms 31324 KB Output is correct
9 Correct 10 ms 31592 KB Output is correct
10 Correct 13 ms 31580 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 237 ms 47536 KB Output is correct
2 Correct 638 ms 58456 KB Output is correct
3 Correct 1090 ms 69472 KB Output is correct
4 Correct 836 ms 63476 KB Output is correct
5 Correct 861 ms 67252 KB Output is correct
6 Correct 1071 ms 122568 KB Output is correct
7 Correct 1012 ms 69000 KB Output is correct
8 Correct 790 ms 62972 KB Output is correct
9 Correct 833 ms 64660 KB Output is correct
10 Correct 505 ms 63584 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 31324 KB Output is correct
2 Correct 10 ms 31368 KB Output is correct
3 Correct 11 ms 31424 KB Output is correct
4 Correct 10 ms 31440 KB Output is correct
5 Correct 11 ms 31576 KB Output is correct
6 Correct 12 ms 31832 KB Output is correct
7 Correct 10 ms 31320 KB Output is correct
8 Correct 11 ms 31324 KB Output is correct
9 Correct 10 ms 31592 KB Output is correct
10 Correct 13 ms 31580 KB Output is correct
11 Incorrect 11 ms 31576 KB Output isn't correct
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 31324 KB Output is correct
2 Correct 10 ms 31368 KB Output is correct
3 Correct 11 ms 31424 KB Output is correct
4 Correct 10 ms 31440 KB Output is correct
5 Correct 11 ms 31576 KB Output is correct
6 Correct 12 ms 31832 KB Output is correct
7 Correct 10 ms 31320 KB Output is correct
8 Correct 11 ms 31324 KB Output is correct
9 Correct 10 ms 31592 KB Output is correct
10 Correct 13 ms 31580 KB Output is correct
11 Incorrect 11 ms 31576 KB Output isn't correct
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 31324 KB Output is correct
2 Correct 10 ms 31368 KB Output is correct
3 Correct 11 ms 31424 KB Output is correct
4 Correct 10 ms 31440 KB Output is correct
5 Correct 11 ms 31576 KB Output is correct
6 Correct 12 ms 31832 KB Output is correct
7 Correct 10 ms 31320 KB Output is correct
8 Correct 11 ms 31324 KB Output is correct
9 Correct 10 ms 31592 KB Output is correct
10 Correct 13 ms 31580 KB Output is correct
11 Correct 237 ms 47536 KB Output is correct
12 Correct 638 ms 58456 KB Output is correct
13 Correct 1090 ms 69472 KB Output is correct
14 Correct 836 ms 63476 KB Output is correct
15 Correct 861 ms 67252 KB Output is correct
16 Correct 1071 ms 122568 KB Output is correct
17 Correct 1012 ms 69000 KB Output is correct
18 Correct 790 ms 62972 KB Output is correct
19 Correct 833 ms 64660 KB Output is correct
20 Correct 505 ms 63584 KB Output is correct
21 Incorrect 11 ms 31576 KB Output isn't correct
22 Halted 0 ms 0 KB -