Submission #400197

#TimeUsernameProblemLanguageResultExecution timeMemory
400197MOUF_MAHMALATRace (IOI11_race)C++14
100 / 100
1997 ms48796 KiB
#include "race.h"
#include<bits/stdc++.h>
#define f first
#define s second
using namespace std;
typedef int ll;
vector<vector<pair<ll,ll> > >v;
ll x,y,p[200009],k,ans=1e7;
bool b[200009];
deque<ll>dq;
map<ll,ll>op;
void dfs(ll d,ll pp)
{
    p[d]=1;
    for(auto z:v[d])
    {
        if(z.f==pp||b[z.f])
            continue;
        dfs(z.f,d);
        p[d]+=p[z.f];
    }
}
ll center(ll d,ll pp)
{
    for(auto z:v[d])
    {
        if(z.f==pp||b[z.f])
            continue;
        if(p[z.f]*2>y)
            return center(z.f,d);
    }
    return d;
}
void add(ll d,ll pp,ll sum,ll h)
{
    if(sum>k)
        return;
    if(op[k-sum]||sum==k)
        ans=min(ans,op[k-sum]+h);
    for(auto z:v[d])
    {
        if(z.f==pp||b[z.f])
            continue;
        add(z.f,d,sum+z.s,h+1);
    }
}
void ok(ll d,ll pp,ll sum,ll h)
{
    if(op[sum])
        op[sum]=min(op[sum],h);
    else
        op[sum]=h;
    for(auto z:v[d])
    {
        if(z.f==pp||b[z.f])
            continue;
        ok(z.f,d,sum+z.s,h+1);
    }
}
ll best_path(ll n, ll K, ll H[][2], ll co[])
{
    k=K;
    if(k==0)
        return 0;
    v.resize(n);
    for(ll i=0; i<n-1; i++)
    {
        x=H[i][0], y=H[i][1];
        v[x].push_back({y,co[i]});
        v[y].push_back({x,co[i]});
    }
    dq.push_back(0);
    while(dq.size())
    {
        x=dq.front();
        dq.pop_front();
        dfs(x,-1);
        y=p[x];
        x=center(x,-1);
        op.clear();
        b[x]=1;
        for(auto z:v[x])
        {
            if(b[z.f])
                continue;
            add(z.f,x,z.s,1);
            ok(z.f,x,z.s,1);
            dq.push_back(z.f);
        }
    }
    if(ans>=n)
        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...