AT2172 Shik and Travel
题目描述:
题解:
二分+暴力$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的更多相关文章
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- AGC007E Shik and Travel 解题报告
AGC007E Shik and Travel 题目大意:\(n\) 个点的二叉树,每个点要么两个儿子,要么没有儿子,每条边有边权. 你从 \(1\) 号节点出发,走到一个叶子节点.然后每一天,你可以 ...
- [AT2172] [agc007_e] Shik and Travel
题目链接 AtCoder:https://agc007.contest.atcoder.jp/tasks/agc007_e 洛谷:https://www.luogu.org/problemnew/sh ...
- AtCoder Grand Contest 007 E:Shik and Travel
题目传送门:https://agc007.contest.atcoder.jp/tasks/agc007_e 题目翻译 现在有一个二叉树,除了叶子每个结点都有两个儿子.这个二叉树一共有\(m\)个叶子 ...
- [AGC007E] Shik and Travel
题目 给定一棵n节点的 以1为根的 满二叉树 (每个非叶子节点恰好有两个儿子)n−1 条边. 第ii条边连接 i+1号点 和 ai, 经过代价为vi设这棵树有m个叶子节点定义一次合法的旅行为:(1) ...
- AtCoder AGC007E Shik and Travel (二分、DP、启发式合并)
题目链接 https://atcoder.jp/contests/agc007/tasks/agc007_e 题解 首先有个很朴素的想法是,二分答案\(mid\)后使用可行性DP, 设\(dp[u][ ...
- [atAGC007E]Shik and Travel
二分枚举答案,判定答案是否合法 贪心:每一个叶子只能经过一遍,因此叶子的顺序一定是一个dfs序,即走完一棵子树中的所有叶子才会到子树外 根据这个贪心可以dp,设$f[k][l][r]$表示仅考虑$k$ ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
随机推荐
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 获取Session对象
Session对象的获取有两种: ● 有参方法: HttpSession request.getSession(boolean isNew) 参数: true:获取一个Session对象,如果之前S ...
- StringUtils中常用方法leftPad(),rightPad(),center()
org.apache.commons.lang3的StringUtils 方法如下: public static String leftPadTime(Integer time){ return ...
- get 和 post 请求的区别(转)
转自 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html http://www.nowamagic.net/librarys/ve ...
- RN初始化项目报错
解决方法:全局删除yarn
- css-原理详解
语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器一般使用id或者class选择器,声明由{}包含,每条声明由一个属性和一个值组成. .city { float:left; ...
- 爬虫之图片懒加载技术、selenium和PhantomJS
爬虫之图片懒加载技术.selenium和PhantomJS 图片懒加载 selenium phantomJs 谷歌无头浏览器 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http:/ ...
- Integer一类的比较问题
总体主要分为两个方面 ①比较的是值 一.基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱(自动拆装箱需要在jdk1.5以上),然后与基本数据类型进行值的比较 举例: int i = 12; ...
- lnmp.org + phpstorm + xdebug
lnmp.org下载安装包安装之: lnmp是个集成安装包,就不用自己在配置lnmp环境 安装phpstorm,破解方法:注册服务器为http://idea.lanyus.com 就可以了 xdebu ...
- bootstrop媒体对象、面板和Well
媒体对象 <div class="media"> <div class="media-left"> < ...
- 随机不重复的取数组元素,并赋值给div使用
function pos(){ var items = $('.starone'); items.each(function () { var rand = getRandom(); $(this). ...