Submission #1290089

#TimeUsernameProblemLanguageResultExecution timeMemory
1290089jojeonghoonMeetings (JOI19_meetings)C++20
29 / 100
378 ms924 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;


const int LM=2020;
set<int> G[LM];
int ch[LM], p[LM];

int sz[LM], ch2[LM];
void dfs(int x, int par=-1){
    sz[x]=1;
    p[x]=par;
    for(int i:G[x]){
        if(i!=par && !ch2[i]){
            dfs(i,x);
            sz[x] += sz[i];
        }
    }
}

void dfsCH(int x, int par){
    ch2[x]=1;
    for(int i:G[x]){
        if(i!=par && !ch2[i]){
            dfsCH(i,x);
        }
    }
}

void Solve(int N){
    G[0].insert(1);
    G[1].insert(0);
    ch[0]=1;
    ch[1]=1;
    
    for(int i=2; i<N; i++){
        if(ch[i]) continue;
        
        fill(ch2,ch2+N+1,0);
        
        while(1){
            int st=0;
            for(; !ch[st] || ch2[st]; st++);
            
            dfs(st);
            
            int M=st;
            for(int j=0; j<N; j++){
                //if(ch[j]) printf("%d %d *\n", j,sz[j]);
                if(!ch2[j] && ch[j] && j!=st && max(sz[st]-sz[M],sz[M]) >= max(sz[st]-sz[j],sz[j]) ){
                    M=j;
                }
            }
            
            //printf("%d %d\n",M,st);
            
            if(M==st){
                G[M].insert(i);
                G[i].insert(M);
                break;
            }
            
            int q = Query(i, M, p[M]);
            
            
            //printf("%d %d %d : %d*\n",i,M,p[M], q);
            
            if(q==M){
                dfsCH(p[M], M);
                continue;
            }
            
            if(q==p[M]){
                dfsCH(M, p[M]);
                /*
                for(int j=0; j<N; j++) printf("%d ", ch2[j]);
                printf("\n");
                 */
                continue;
            }
            
            
            G[M].erase(p[M]);
            G[p[M]].erase(M);
            
            G[M].insert(q);
            G[q].insert(M);
            G[p[M]].insert(q);
            G[q].insert(p[M]);
            
            if(q!=i){
                G[q].insert(i);
                G[i].insert(q);
                ch[q]=1;
            }
            
            break;
        }
        /*
        for(int i=0; i<N; i++){
            for(int j: G[i]) if(i<j) printf("%d %d\n",i,j);
        }
        cout<<'\n'<<'\n';
         
        */
        ch[i]=1;
    }
    /*
    for(int i=0; i<N; i++){
        for(int j: G[i]) if(i<j) printf("%d %d\n",i,j);
    }*/
    
    for(int i=0; i<N; i++){
        for(int j: G[i]) if(i<j) Bridge(i, j);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...