Submission #907525

# Submission time Handle Problem Language Result Execution time Memory
907525 2024-01-15T20:02:22 Z JakobZorz Parachute rings (IOI12_rings) C++17
37 / 100
1361 ms 139536 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;
        }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:103:25: warning: unused variable 'ne' [-Wunused-variable]
  103 |                 for(int ne:nodes[a]){
      |                         ^~
rings.cpp: In function 'int CountCritical()':
rings.cpp:146:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::unordered_set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |         return num3n[num4]==num3.size()&&in_cycle;
      |                ~~~~~~~~~~~^~~~~~~~~~~~~
rings.cpp:155:9: warning: unused variable 'res' [-Wunused-variable]
  155 |     int res=0;
      |         ^~~
# Verdict Execution time Memory Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 11 ms 33368 KB Output is correct
3 Correct 11 ms 33372 KB Output is correct
4 Correct 12 ms 33412 KB Output is correct
5 Correct 12 ms 33372 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 12 ms 33372 KB Output is correct
9 Correct 10 ms 33372 KB Output is correct
10 Correct 11 ms 33288 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 261 ms 57756 KB Output is correct
2 Correct 726 ms 73040 KB Output is correct
3 Correct 1361 ms 84468 KB Output is correct
4 Correct 999 ms 80892 KB Output is correct
5 Correct 1105 ms 84512 KB Output is correct
6 Correct 1357 ms 139536 KB Output is correct
7 Correct 1201 ms 84820 KB Output is correct
8 Correct 897 ms 79184 KB Output is correct
9 Correct 1012 ms 81840 KB Output is correct
10 Correct 542 ms 76584 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 11 ms 33368 KB Output is correct
3 Correct 11 ms 33372 KB Output is correct
4 Correct 12 ms 33412 KB Output is correct
5 Correct 12 ms 33372 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 12 ms 33372 KB Output is correct
9 Correct 10 ms 33372 KB Output is correct
10 Correct 11 ms 33288 KB Output is correct
11 Incorrect 12 ms 33540 KB Output isn't correct
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 11 ms 33368 KB Output is correct
3 Correct 11 ms 33372 KB Output is correct
4 Correct 12 ms 33412 KB Output is correct
5 Correct 12 ms 33372 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 12 ms 33372 KB Output is correct
9 Correct 10 ms 33372 KB Output is correct
10 Correct 11 ms 33288 KB Output is correct
11 Incorrect 12 ms 33540 KB Output isn't correct
12 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 10 ms 33116 KB Output is correct
2 Correct 11 ms 33368 KB Output is correct
3 Correct 11 ms 33372 KB Output is correct
4 Correct 12 ms 33412 KB Output is correct
5 Correct 12 ms 33372 KB Output is correct
6 Correct 13 ms 33884 KB Output is correct
7 Correct 10 ms 33116 KB Output is correct
8 Correct 12 ms 33372 KB Output is correct
9 Correct 10 ms 33372 KB Output is correct
10 Correct 11 ms 33288 KB Output is correct
11 Correct 261 ms 57756 KB Output is correct
12 Correct 726 ms 73040 KB Output is correct
13 Correct 1361 ms 84468 KB Output is correct
14 Correct 999 ms 80892 KB Output is correct
15 Correct 1105 ms 84512 KB Output is correct
16 Correct 1357 ms 139536 KB Output is correct
17 Correct 1201 ms 84820 KB Output is correct
18 Correct 897 ms 79184 KB Output is correct
19 Correct 1012 ms 81840 KB Output is correct
20 Correct 542 ms 76584 KB Output is correct
21 Incorrect 12 ms 33540 KB Output isn't correct
22 Halted 0 ms 0 KB -