1 条题解
-
0

#include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int M = 200005; #define int long long #define pii pair<int,int> #define pb push_back #define x first #define y second int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,k,ans,ch[M][2],c[M][2];vector<pii> v[M]; void dfs(int u) { v[u].clear(); if(!ch[u][0]) {v[u].pb({0,0});return ;} dfs(ch[u][0]);dfs(ch[u][1]); vector<pii> vc; for(int d=0;d<2;d++) { int ls=ch[u][d],rs=ch[u][d^1]; int lc=c[u][d],rc=c[u][d^1],tmp=k-lc-rc; for(int i=0,j=0;i<v[ls].size();i++) { while(j+1<v[rs].size() && v[rs][j+1].x+v[ls][i].y<=tmp) j++; if(j>=v[rs].size() || v[rs][j].x+v[ls][i].y>tmp) continue; vc.pb({v[ls][i].x+lc,v[rs][j].y+rc}); } } sort(vc.begin(),vc.end()); for(auto t:vc) { if(!v[u].empty() && v[u].back().y<=t.y) continue; v[u].pb(t); } } signed main() { n=read(); for(int i=2;i<=n;i++) { int j=read(),w=ch[j][0]>0; ch[j][w]=i;c[j][w]=read(); } int l=0,r=1e12; while(l<=r) { k=(l+r)>>1;dfs(1); if(v[1].empty()) l=k+1; else r=k-1,ans=k; } printf("%lld\n",ans); }
- 1
信息
- ID
- 8768
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者