题目描述:

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 ;
}

AT2172 Shik and Travel的更多相关文章

  1. 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]

    Shik and Travel Time Limit: 50 Sec  Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...

  2. AGC007E Shik and Travel 解题报告

    AGC007E Shik and Travel 题目大意:\(n\) 个点的二叉树,每个点要么两个儿子,要么没有儿子,每条边有边权. 你从 \(1\) 号节点出发,走到一个叶子节点.然后每一天,你可以 ...

  3. [AT2172] [agc007_e] Shik and Travel

    题目链接 AtCoder:https://agc007.contest.atcoder.jp/tasks/agc007_e 洛谷:https://www.luogu.org/problemnew/sh ...

  4. AtCoder Grand Contest 007 E:Shik and Travel

    题目传送门:https://agc007.contest.atcoder.jp/tasks/agc007_e 题目翻译 现在有一个二叉树,除了叶子每个结点都有两个儿子.这个二叉树一共有\(m\)个叶子 ...

  5. [AGC007E] Shik and Travel

    题目 给定一棵n节点的 以1为根的 满二叉树 (每个非叶子节点恰好有两个儿子)n−1 条边. 第ii条边连接 i+1号点 和 ai, 经过代价为vi设这棵树有m个叶子节点定义一次合法的旅行为:(1) ...

  6. AtCoder AGC007E Shik and Travel (二分、DP、启发式合并)

    题目链接 https://atcoder.jp/contests/agc007/tasks/agc007_e 题解 首先有个很朴素的想法是,二分答案\(mid\)后使用可行性DP, 设\(dp[u][ ...

  7. [atAGC007E]Shik and Travel

    二分枚举答案,判定答案是否合法 贪心:每一个叶子只能经过一遍,因此叶子的顺序一定是一个dfs序,即走完一棵子树中的所有叶子才会到子树外 根据这个贪心可以dp,设$f[k][l][r]$表示仅考虑$k$ ...

  8. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  9. AtCoder Grand Contest 007

    AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...

随机推荐

  1. [Xcode 实际操作]九、实用进阶-(13)调用相机并获取拍摄后的图片

    目录:[Swift]Xcode实际操作 本文将演示如何调用相机并获取拍摄后的图片. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首 ...

  2. (八)SpringBoot使用mybatis-plus+自动代码生成

    一.SpringBoot使用mybatis-plus+自动代码生成 使用mybatis-plus可以自动帮我们生成通用的 controller,service,dao,mapper 二.加入依赖 &l ...

  3. php-fpm 高并发 参数调整

    工作中经常会遇到会给客户配置服务器,其中有的客户还会有并发量要求,其中也会必须要用负载均衡承载压力的.增加服务器数量肯定能有效的提升服务器承载能力,但只有根据目前已有配置设置好单台服务器才能更好的发挥 ...

  4. python如何永久添加模块搜索路径

    win10系统 依次点击:控制面板\系统和安全\系统\高级系统设置\环境变量   找不到的话,直接在设置中搜索  环境变量  也一样 此时上面是用户变量 下面是系统变量   在系统变量中找到PYTHO ...

  5. Codeforces Round #547 (Div. 3) D. Colored Boots

    链接:https://codeforces.com/contest/1141/problem/D 题意: 给连个n长度的字符串. 求两个字符串相同字符对应位置的对数,并挨个打印. 字符:?可以代替任何 ...

  6. 17 文件和网络I/O

    1       文件和网络I/O 1.1  文件处理 groovy向java所提供的File 类,新增了几个方便的方法.分别是:eachLine和.text. package file class F ...

  7. jQuery制作一个多彩下拉菜单按钮

    最终效果图: html代码: <div id="list"> <div id="btn"> <div class="ic ...

  8. springmvc整合elasticsearch

    网上大多时关于springboot整合的,也有spring的,但是 坑太多,都没法愉快的玩耍 这篇让我整合成功 https://www.cnblogs.com/sunny1009/articles/7 ...

  9. java数据结构和算法06(红黑树)

    这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...

  10. I/O————缓存流

    为什么要使用缓存流? 当对磁盘访问次数多的时候,字节流和字符流就会感觉性能不佳,速度较慢. 缓存流,一次会读取很多的数据到缓存中,以后每一次读取都是从缓存中读取,直到缓存中数据读取完,这样就减少了io ...