제출 #97861

#제출 시각아이디문제언어결과실행 시간메모리
97861TuGSGeReL경주 (Race) (IOI11_race)C++17
21 / 100
3082 ms40604 KiB
    #include "race.h"
    #include<bits/stdc++.h>
    #include <ext/pb_ds/assoc_container.hpp>
    using namespace std;
    using namespace __gnu_pbds;
    #define ll long long
    #define mp make_pair
    #define pub push_back
    #define pob pop_back()
    #define ss second
    #define ff first
    #define mt make_tuple
    #define pof pop_front()
    #define fbo find_by_order
    #define ook order_of_key
    typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
    int i,ans=1e9,c[200001],used[200001];
    vector<pair<int,int> >v[200001];
    unordered_map<int,int>xox,yoy;
    inline void dfs(int u, int par){
    	for(auto x : v[u]) if(x.ff!=par) dfs(x.ff,u); 
    	c[par]+=c[u];
    }
    inline void dfs1(int u, int parr, int s, int d){
    	if(yoy.find(s) == yoy.end())yoy[s]=d;
    	else yoy[s]=min(yoy[s],d);
    	for(auto x : v[u]){
    		if(x.ff!=parr && !used[x.ff]) dfs1(x.ff,u,s+x.ss,d+1);
    	}
    }
    inline int fnd(int u , int sz){
    	for(auto x : v[u]){
    		if(!used[x.ff] && c[x.ff]>sz){
    			c[u]-=c[x.ff];
    			c[x.ff]+=c[u];
    			return fnd(x.ff,sz);
    		}
    	}
    	return u;
    }
    inline void solve(int at, int k){
    	at=fnd(at,c[at]/2);
    	used[at]=1;
    	xox.clear();
    	xox[0]=0;
    	for(auto z : v[at]){
    		if(used[z.ff]) continue;
    		yoy.clear();
    		dfs1(z.ff,at,z.ss,1);
    		for(auto haha : yoy) if(xox.find(k-haha.ff)!=xox.end()) ans=min(ans,haha.ss+xox[k-haha.ff]);
    		for(auto lol : yoy){
    			if(xox.find(lol.ff)==xox.end()) xox[lol.ff]=lol.ss;
    			else xox[lol.ff]=min(xox[lol.ff],lol.ss);
    		}
    	}
    	for(auto hha : v[at]) if(!used[hha.ff]) solve(hha.ff,k);
    }
    int best_path(int N, int K, int H[][2], int L[]) {
    	for(i=0;i<N-1;i++){
    		c[i]=1;
    		v[H[i][0]].pub(mp(H[i][1],L[i]));
    		v[H[i][1]].pub(mp(H[i][0],L[i]));
    	}
    	c[N-1]=1;
    	dfs(0,0);
    	solve(0,K);
    	if(ans==1e9) ans=-1;
    	return ans;
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...