제출 #1352316

#제출 시각아이디문제언어결과실행 시간메모리
1352316yyc000123즐거운 행로 (APIO20_fun)C++20
0 / 100
1 ms344 KiB
#include<bits/stdc++.h>
using namespace std ;
#define F first
#define S second
const int N = 1e5+5 ;
const int Q = 4e5+5 ;
int n , sub[N] , deep[N] ;
vector<int> ans , vd[N] , nei[N] ;
vector<pair<int,int>> vp[3] ;

int hoursRequired(int x , int y) ;
int attractionsBehind(int x , int y) ;

void dfs(int node , int t){
    vp[t].push_back({deep[node],node}) ;
    for(int i:nei[node]){
        deep[i]=deep[node]+1 ;
        dfs(i,t) ;
    }
}

vector<int> createFunTour(int n1 , int q){
    n = n1 ;
    int pos = -1 ;
    for(int i=0 ; i<n ; i++){
        sub[i]=attractionsBehind(0,i) ;
        if(sub[i]>=(n+1)/2 && (pos==-1 || sub[i]<sub[pos])) pos = i ; 
    }
    for(int i=0 ; i<n ; i++) deep[i]=hoursRequired(pos,i) , vd[deep[i]].push_back(i) ;
    for(int i=1 ; i<=n ; i++){
        for(int j:vd[i]){
            int cnt = 0 ;
            for(int l:vd[i-1]){
                if(cnt==2 || hoursRequired(l,j)==1){
                    nei[l].push_back(j) ;
                    break ;
                }
                cnt++ ;
            }
        }
    }
    deep[pos]=0 ;
    for(int i=0 ; i<nei[pos].size() ; i++) deep[nei[pos][i]]=1 , dfs(nei[pos][i],i) , sort(vp[i].begin(),vp[i].end()) ;



    // others code start

    std::vector<int> siz(n);
    siz[0] = n;

    for (int i = 1; i < n; i++)
        siz[i] = attractionsBehind(0, i);

    int root = -1;

    for (int i = 0; i < n; i++)
        if (siz[i] >= (n + 1) / 2)
            if (root == -1 || siz[root] > siz[i])
                root = i;

    std::vector<int> dist(n);

    for (int i = 0; i < n; i++)
        dist[i] = hoursRequired(root, i);

    std::vector<int> sons;
    std::vector<std::vector<int>> subtr;

    for (int i = 0; i < n; i++)
        if (dist[i] == 1)
            sons.push_back(i);

    subtr.resize(sons.size());

    for (int i = 0; i < n; i++) {
        if (i == root)
            continue;

        bool found = false;

        for (int j = 0; !found && j < 2; j++)
            if (dist[i] - dist[sons[j]] == hoursRequired(i, sons[j]))
                found = true, subtr[j].push_back(i);

        if (!found)
            subtr[2].push_back(i);
    }

    auto cmp = [&dist](const int &x, const int &y) -> bool {
        return dist[x] < dist[y];
    };

    for (auto &tr : subtr)
        std::sort(tr.begin(), tr.end(), cmp);

    // others code end



    assert(pos==root) ; //
    int s = 0 ;
    for(int i=0 ; i<3 ; i++){
        if(!vp[i].empty()) s++ ;
    }
    assert(s==subtr.size()) ; //
    return {} ; //
    for(int i=0 ; i<s ; i++){
        assert(vp[i].size()==subtr[i].size()) ; //
        int pos = 0 ;
        for(auto it:vp[i]){
            assert(it.S==subtr[i][pos]) ; //
            pos++ ;
        }
    }
    return {} ;
    


/*
    int t = -1 , sum = n-1 ;
    while(sum){
        int a = vp[0].size() , b = vp[1].size() , c = vp[2].size() ;
        if(abs(max({a,b,c})-(a+b+c-max({a,b,c})))<=1){
            if(b>=a && b>=c){
                swap(vp[0],vp[1]) ; swap(a,b) ;
                if(t!=2 && t!=-1) t=!t ;
            }
            if(c>=a && c>=b){
                swap(vp[0],vp[2]) ; swap(a,c) ;
                if(t!=1 && t!=-1) t=2-t ;
            }
            if(t) t=1 ;
            //
            if(t>0){
                t = 3-t ;
                // if(t==1 && deep[ans.back()]<-st[2].begin()->F) t=2 , ans.push_back(st[t].begin()->S) , st[t].erase(st[t].begin()) ;
                // else if(t==2 && deep[ans.back()]<-st[1].begin()->F) t=1 , ans.push_back(st[t].begin()->S) , st[t].erase(st[t].begin()) ;
                // else sum++ ;
                // t = 1 ; sum-- ;
            }
            else if(t==-1) t=1 ;
            //
            for(auto it:vp[2]) vp[1].push_back(it) ;
            sort(vp[1].begin(),vp[1].end()) ;
            vp[2].clear() ;
            break ;
        }
        int cur = -1 ;
        for(int i=0 ; i<3 ; i++){
            if(i!=t && (cur==-1 || vp[i].back().F<vp[cur].back().F)) cur = i ;
        }
        if(cur==-1) return {} ; //
        t = cur ;
        ans.push_back(vp[cur].back().S) ;
        vp[cur].pop_back() ;
        sum-- ;
    }
    while(sum){
        if(vp[!t].empty()) t=!t ;
        ans.push_back(vp[!t].back().S) ;
        vp[!t].pop_back() ;
        t=!t ; sum-- ;
    }
    ans.push_back(pos) ;
    return ans ;
    */
}

/*
int hoursRequired(int x , int y){
    cout << "h " << x << ' ' << y << '\n' ;
    int k ; cin >> k ; return k ;
}
int attractionsBehind(int x , int y){
    cout << "a " << x << ' ' << y << '\n' ;
    int k ; cin >> k ; return k ;
}
int main(){
    vector<int> v = createFunTour(7,Q-5) ; for(int i:v) cout << i << ' ' ; cout << '\n' ;
    return 0 ;
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...