题目描述:

luogu

题解:

二分+暴力$vector$+$dfs$。

记录下所有可能的子树内合法方案,双指针+归并合并。

代码:

#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,fa[N],ch[N][];
ll v[N],dep[N];
void DFS(int u)
{
if(!ch[u][])return ;
dep[ch[u][]]=dep[u]+v[ch[u][]],DFS(ch[u][]);
dep[ch[u][]]=dep[u]+v[ch[u][]],DFS(ch[u][]);
}
struct Pair
{
ll x,y;
Pair(){}
Pair(ll x,ll y):x(x),y(y){}
}g1[N],g2[N],g[N];
vector<Pair>ve[N];
ll mid;
int Merge(int len)
{
int i = ,j = len,k = ;
while(i<=len&&j>=)
{
if(g1[i].x<=g2[j].x)g[++k]=g1[i++];
else g[++k]=g2[j--];
}
while(i<=len)g[++k]=g1[i++];
while(j>=)g[++k]=g2[j--];
return k;
}
void dfs(int u)
{
if(!ch[u][]){ve[u].push_back(Pair(dep[u],dep[u]));return ;}
int ls = ch[u][],rs = ch[u][];
dfs(ls),dfs(rs);int k=;
if(ve[ls].size()>ve[rs].size())swap(ls,rs);
for(int i=,j=-,l1=ve[ls].size(),l2=ve[rs].size();i<l1;i++)
{
while(j<l2-&&ve[ls][i].y+ve[rs][j+].x-2ll*dep[u]<=mid)j++;
if(~j)g1[++k]=Pair(ve[ls][i].x,ve[rs][j].y),g2[k]=Pair(ve[rs][j].y,ve[ls][i].x);
}
int len = Merge(k);
for(int i=;i<=len;i++)
if(i==||g[i].y<g[i-].y)
ve[u].push_back(g[i]);
}
bool check()
{
for(int i=;i<=n;i++)
ve[i].clear();
dfs();
return (int)ve[].size()>;
}
int main()
{
read(n);
for(int i=;i<=n;i++)
{
read(fa[i]),read(v[i]);
if(!ch[fa[i]][])ch[fa[i]][]=i;
else ch[fa[i]][]=i;
}
DFS();
ll l = ,r = 200000ll*n,ans = r;
while(l<=r)
{
mid = (l+r)>>;
if(check())ans=mid,r=mid-;
else l=mid+;
}
printf("%lld\n",ans);
return ;
}

最新文章

  1. ACM提交结果简介
  2. Spark 官方文档(4)——Configuration配置
  3. [NOIP2014]寻找道路 题解
  4. JavaScript 闭包系列一
  5. Oracle常用命令
  6. jquery对javascript事件的封装一览
  7. webservice远程调试开启
  8. .NET本质论之三(应用程序对象 )
  9. NET Core中使用Redis
  10. 利用WPF创建含多种交互特性的无边框窗体
  11. 使用qt制作简单的加法,乘法运算。
  12. Hexo+NextT基本设置【3】
  13. Windows如何上传代码到Github
  14. jdbc模板
  15. 俄罗斯方块win c 图形线程
  16. spring事务详解(二)简单样例
  17. Java发送Email邮件及SpringBoot集成
  18. $Django setting.py配置 ,GET、POST深入理解,三件套,orm对象关系映射简介
  19. java 得到目录路径的方法
  20. A1102. Invert a Binary Tree

热门文章

  1. java 三大基本特征
  2. Linux安装Loadrunner generator
  3. LocalBroadcastManager
  4. Python及bs4、lxml、numpy模块包的安装
  5. Python入门小练习
  6. 洛谷P2505||bzoj2750 [HAOI2012]道路 &amp;&amp; zkw线段树
  7. springMVC-数据传递
  8. 04.Javascript——入门一些方法记录之iterable
  9. JavaMailSender怎么发送163和qq邮件
  10. jasmine+karma 自动化单元测试