제출 #573959

#제출 시각아이디문제언어결과실행 시간메모리
573959nohaxjustsoflo경주 (Race) (IOI11_race)C++17
100 / 100
1124 ms43328 KiB
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> order_set;
mt19937 mt_rand(chrono::high_resolution_clock::now().time_since_epoch().count());
//uniform_int_distribution<int> gen(-1e9, 1e8); ///(min, max)
//int random() {return gen(mt_rand);}
const int mxN = 2e5+5;
const int mod = 1e9+7;
const int mxlogN = 34;
const int mxK = 26;
//const ll inf = 1e18;
const int K = 100000;
struct edge
{
    int u,v,w;
    int other(int i)
    {
        return u^v^i;
    }
};
edge es[mxN];
bool vis[mxN];
int cc[mxN];
vector<int> adj[mxN];
void init(int i, int p=-1)
{
    cc[i]=1;
    for(int e:adj[i])
    {
        int j=es[e].other(i);
        if(p==j||vis[j]) continue;
        init(j,i);
        cc[i]+=cc[j];
    }
}
int find_centroid(int i, int n, int p=-1)
{
    for(int e:adj[i])
    {
        int j=es[e].other(i);
        if(p==j||vis[j]) continue;
        if(cc[j]>n/2) return find_centroid(j,n,i);
    }
    return i;
}
const int inf=2e6;
int k;
map<int, int> mp;
int solve2(int i, int r, int w, bool edit, int d=1, int p=-1)
{
    if(w==k) return d;
    if(w>k) return inf;
    int ans=inf;
    if(!edit)
    {
        if(mp.count(k-w)) ans=min(ans, d+mp[k-w]);
    }
    else
    {
        if(mp.count(w)) mp[w]=min(mp[w], d);
        else mp[w]=d;
    }
    for(int e:adj[i])
    {
        int j=es[e].other(i);
        if(p==j||vis[j]) continue;
        ans=min(ans,solve2(j,r,w+es[e].w,edit,d+1,i));
    }
    return ans;
}
int solve(int i)
{
    init(i);
    i=find_centroid(i,cc[i]);
    vis[i]=1;
    int ans=inf;
    for(int e:adj[i])
    {
        int j=es[e].other(i);
        if(vis[j]) continue;
        ans=min(ans,solve2(j,j,es[e].w,0));
        solve2(j,j,es[e].w,1);
    }
    mp.clear();
    for(int e:adj[i])
    {
        int j=es[e].other(i);
        if(vis[j]) continue;
        ans=min(ans,solve(j));
    }
    return ans;
}
int best_path(int N, int K, int H[][2], int L[])
{
    k=K;
    for(int i=0; i+1<N; i++)
    {
        int u=H[i][0], v=H[i][1], w=L[i];
        es[i]={u,v,w};
        adj[u].push_back(i);
        adj[v].push_back(i);
    }
    int ans=solve(0);
    if(ans==inf) ans=-1;
    return ans;
}
/*
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, k; cin >> n >> k;
    int H[n-1][2];
    for(int i=0; i+1<n; i++) cin >> H[i][0] >> H[i][1];
    int L[n-1];
    for(int i=0; i+1<n; i++) cin >> L[i];
    cout << best_path(n,k,H,L);
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...