제출 #247700

#제출 시각아이디문제언어결과실행 시간메모리
247700tqbfjotldMeetings (JOI19_meetings)C++14
100 / 100
897 ms1272 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;

set<int> adjl[2005];
int sz[2005];
bool block[2005];
bool done[2005];
int n;

void dfs(int node, int p){
    sz[node] = 1;
    for (int x : adjl[node]){
        if (x==p) continue;
        if (block[x]) continue;
        dfs(x,node);
        sz[node] += sz[x];
    }
}

int findCentroid(int node, int p, int total){
    for (int x : adjl[node]){
        if (x==p) continue;
        if (block[x]) continue;
        if (sz[x]>total/2){
            return findCentroid(x,node,total);
        }
    }
    return node;
}

void addNode(int node, int root){
    dfs(root,-1);
    if (sz[root]==1){
        adjl[root].insert(node);
        adjl[node].insert(root);
        return;
    }
    if (sz[root]==2){
        int ch = -1;
        for (int x : adjl[root]){
            if (block[x]) continue;
            ch = x;
        }
        int res = Query(root,ch,node);
        if (res==root){
            adjl[root].insert(node);
            adjl[node].insert(root);
        }
        else if (res==ch){
            adjl[ch].insert(node);
            adjl[node].insert(ch);
        }
        else if (res==node){
            adjl[root].erase(ch);
            adjl[ch].erase(root);
            adjl[root].insert(node);
            adjl[node].insert(root);
            adjl[ch].insert(node);
            adjl[node].insert(ch);
        }
        else{
            adjl[root].erase(ch);
            adjl[ch].erase(root);
            adjl[root].insert(res);
            adjl[res].insert(root);
            adjl[ch].insert(res);
            adjl[res].insert(ch);
            adjl[res].insert(node);
            adjl[node].insert(res);
            done[res] = true;
        }
        return;
    }
    root = findCentroid(root,-1,sz[root]);
    dfs(root,-1); ///re-root at centroid
    //printf("centroid %d\n",root);
    vector<pair<int,int> > children;
    for (int child : adjl[root]){
        if (block[child]) continue;
        children.push_back({sz[child],child});
        //printf("added %d %d\n",sz[child],child);
    }
    sort(children.begin(),children.end(),greater<pair<int,int> >());
    //assert(children.size()!=1);
    if (children.size()&1){
        children.push_back(children[0]);
    }
    for (int x = 0; x<children.size(); x+=2){
        int n1 = children[x].second;
        int n2 = children[x+1].second;
        int res = Query(node,n1,n2);
        if (res==n1){
            block[root] = true;
            addNode(node,n1);
            block[root] = false;
            return;
        }
        if (res==n2){
            block[root] = true;
            addNode(node,n2);
            block[root] = false;
            return;
        }
        if (res!=root){
            ///res is either on edge root-n1 or root-n2
            int res2 = Query(root,n1,res);
            if (res2==res){
                adjl[root].erase(n1);
                adjl[n1].erase(root);
                adjl[root].insert(res);
                adjl[n1].insert(res);
                adjl[res].insert(root);
                adjl[res].insert(n1);
                if (res!=node){
                adjl[res].insert(node);
                adjl[node].insert(res);
                }
            }
            else if (res2==root){
                adjl[root].erase(n2);
                adjl[n2].erase(root);
                adjl[root].insert(res);
                adjl[n2].insert(res);
                adjl[res].insert(root);
                adjl[res].insert(n2);
                if (res!=node){
                adjl[node].insert(res);
                adjl[res].insert(node);
                }
            }
            else{
                //assert(false);
            }
            done[res] = true;
            return;
        }

    }
    ///directly connected to root
    adjl[root].insert(node);
    adjl[node].insert(root);

}

void Solve(int N) {
    n = N;
    for (int nw = 1; nw<N; nw++){
        if (done[nw]) continue;
        addNode(nw,0);
        /*for (int x = 0; x<N; x++){
            for (int node : adjl[x]){
                if (node<=x){
                    //printf("now %d, %d--%d\n",nw,node,x);
                }
            }
        }*/
    }
    for (int x = 0; x<N; x++){
        for (int node : adjl[x]){
            if (node<x){
                Bridge(node,x);
            }
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

meetings.cpp: In function 'void addNode(int, int)':
meetings.cpp:89:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int x = 0; x<children.size(); x+=2){
                     ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...