/*
Author of all code: Pedro BIGMAN Dias
Last edit: 15/02/2021
*/
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <deque>
#include <list>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <cstring>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
#define REP(i,a,b) for(ll i=(ll) a; i<(ll) b; i++)
#define pb push_back
#define mp make_pair
#define pl pair<ll,ll>
#define ff first
#define ss second
#define whole(x) x.begin(),x.end()
#define DEBUG(i) cout<<"Pedro Is The Master "<<i<<endl
#define INF 500000000LL
#define EPS 0.00000001
#define pi 3.14159
ll mod=1000000007LL;
template<class A=ll>
void Out(vector<A> a) {REP(i,0,a.size()) {cout<<a[i]<<" ";} cout<<endl;}
template<class A=ll>
void In(vector<A> &a, ll N) {A cur; REP(i,0,N) {cin>>cur; a.pb(cur);}}
ll M; ll N; vector<ll> r,c;
class Tree
{
public:
ll N;
vector<ll> p;
vector<vector<ll> > sons;
vector<vector<ll> > adj;
ll root;
vector<bool> visited;
vector<vector<ll> > dp;
Tree(vector<vector<ll> > ad, ll r=0LL)
{
N=ad.size(); root=r; adj=ad;
REP(i,0,N) {visited.pb(false);}
vector<ll> xx; REP(i,0,N) {sons.pb(xx); p.pb(-1);}
DFS_Build(r,r);
REP(i,0,M) {xx.pb(-1LL);}
REP(i,0,N) {dp.pb(xx);}
}
void Reset()
{
REP(i,0,N) {visited[i]=false;}
}
void DFS_Build(ll s, ll par)
{
p[s]=par;
visited[s]=true;
REP(i,0,adj[s].size())
{
if(adj[s][i]==par) {continue;}
sons[s].pb(adj[s][i]);
DFS_Build(adj[s][i],s);
}
return;
}
void DP(ll s)
{
if(dp[s][0]!=-1) {return;}
REP(i,0,sons[s].size())
{
ll son=sons[s][i]; DP(son);
}
if(sons[s].size()==0)
{
REP(i,0,M) {dp[s][i]=c[s];}
dp[s][r[s]]=0LL;
return;
}
ll S = sons[s].size(); ll son; ll sum=0LL;
vector<ll> bestyet; REP(i,0,S) {son=sons[s][i]; bestyet.pb(dp[son][M-1]); sum+=dp[son][M-1];}
dp[s][M-1] = c[s]+sum;
for(ll val=M-2;val>=0;val--)
{
REP(i,0,S)
{
son=sons[s][i];
if(dp[son][val]<bestyet[i])
{
sum-=(bestyet[i]-dp[son][val]);
bestyet[i]=dp[son][val];
}
}
dp[s][val]=c[s]+sum;
}
dp[s][r[s]]-=c[s];
return ;
}
};
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>N; vector<ll> xx; vector<vector<ll> > adj; REP(i,0,N) {adj.pb(xx);}
ll cur;
ll rat, cost;
REP(i,0,N)
{
cin>>cur>>rat>>cost; r.pb(rat); c.pb(cost); if(i==0) {continue;}
cur--; adj[cur].pb(i); adj[i].pb(cur);
}
set<ll> s; REP(i,0,N) {s.insert(r[i]);}
set<ll>::iterator it=s.begin();
unordered_map<ll,ll> comp; cur=0LL;
while(it!=s.end())
{
comp[*it]=cur; cur++;
it++;
}
M = s.size();
Tree T(adj);
REP(i,0,N) {r[i]=comp[r[i]];}
T.DP(0LL);
cout<<*min_element(whole(T.dp[0]))<<endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |