xsy 1790 - 不回头的旅行
from NOIP2016模拟题28
Description
一辆车,开始没油,可以选择一个点(加油站)出发
经过一个点i可加g[i]的油,走一条边减少len的油
没油的时候车就跪了
特别的,跪在加油站上可以加油继续走
给出一棵树,求最多可以走过多少个点
Analysis
点分治很明显的,只是dfs要点技巧
求出从根往下走到某个点的深度及需要的油
求出从某个点往上走到根的深度及提供的油
注意要同样的两个端点,不同方向走答案不同
所以点分时要扫两次
向下
每个点到根的消耗/剩余会长得像心电图

我们只要保证最低点>=0就好
向上
我们记录一个mx表示每个点到上一个可到根的点的消耗/剩余
每次从mx=0的可到根点x出发会经过如图

轨迹到达下一个mx>=0的点
则那个点可以到x
(旋转180°,改下0点)就变成从下面出发了
同时要把mx变回0
Code
#include <cstdio>
#include <cstdlib>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
const int INF=2147483647;
const int M=100007;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
int n;
int val[M];
int g[M],te;
struct edge{int y,d,next;}e[M<<1];
void addedge(int x,int y,int z){
e[++te].y=y;e[te].d=z;e[te].next=g[x];g[x]=te;
}
struct node{
int y,d;
node(int yy=0,int dd=0){y=yy;d=dd;}
}que[M];
int tq;
int vis[M];
int sz[M];
int mi,size,rt;
int a[M];
int ans=0;
void getsz(int x,int fa){
sz[x]=1;
int p,y;
for(p=g[x];p;p=e[p].next)
if(!vis[y=e[p].y]&&y!=fa){
getsz(y,x);
sz[x]+=sz[y];
}
}
void getrt(int x,int fa){
int f,p,y;
f=size-sz[x];
for(p=g[x];p;p=e[p].next)
if(!vis[y=e[p].y]&&y!=fa){
getrt(y,x);
f=max(f,sz[y]);
}
if(f<mi) mi=f,rt=x;
}
void find(int dep,int supply){
int l=1,r=size,mid;
while(l<r){
mid=(l+r)/2 +1;
if(a[mid]<=supply) l=mid;
else r=mid-1;
}
ans=max(ans,l+dep);
}
void getup(int x,int fa,int dep,int nw,int mn){
if(mn>=0){
find(dep,nw);
mn=0;
}
int p,y;
for(p=g[x];p;p=e[p].next)
if(!vis[y=e[p].y]&&y!=fa)
getup(y,x,dep+1,nw+val[y]-e[p].d, mn+val[y]-e[p].d);
}
void getdw(int x,int fa,int dep,int nw,int mn){
mn=min(mn,nw);
a[dep]=min(a[dep],-min(mn,0));
int p,y;
for(p=g[x];p;p=e[p].next)
if(!vis[y=e[p].y]&&y!=fa)
getdw(y,x,dep+1,nw+val[x]-e[p].d, mn);
}
void calc(int x){
int i,j,p,y,d;
getsz(x,0);
tq=0;
for(p=g[x];p;p=e[p].next)
if(!vis[y=e[p].y]) que[++tq]=node(e[p].y,e[p].d);
for(i=1;i<=sz[x]+1;i++) a[i]=INF;
a[1]=0;
for(i=1;i<=tq;i++){
y=que[i].y; d=que[i].d;
getup(y,0,1,val[y]-d,val[y]-d);
getdw(y,0,2,val[x]-d,INF);
for(j=sz[y]+1;j>0;j--) a[j]=min(a[j],a[j+1]);
}
for(i=1;i<=sz[x]+1;i++) a[i]=INF;
a[1]=0;
for(i=tq;i>=1;i--){
y=que[i].y; d=que[i].d;
getup(y,0,1,val[y]-d,val[y]-d);
getdw(y,0,2,val[x]-d,INF);
for(j=sz[y]+1;j>0;j--) a[j]=min(a[j],a[j+1]);
}
}
void work(int fr){
getsz(fr,0);
mi=size=sz[fr];
getrt(fr,0);
int x=rt,p,y;
vis[x]=1;
calc(x);
for(p=g[x];p;p=e[p].next)
if(!vis[y=e[p].y]){
work(y);
}
}
int main(){
int i,x,y,z;
n=rd();
for(i=1;i<=n;i++) val[i]=rd();
for(i=1;i<n;i++){
x=rd(),y=rd(),z=rd();
addedge(x,y,z);
addedge(y,x,z);
}
work(1);
printf("%d\n",ans);
return 0;
}
xsy 1790 - 不回头的旅行的更多相关文章
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- Unable to load R3 module D:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 (VERR_UNRESOLVED_ERROR).
Unable to load R3 module D:\Program Files\Oracle\VirtualBox/VBoxDD.DLL (VBoxDD): GetLastError=1790 ( ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- nyoj 71 独木舟上的旅行(贪心专题)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- 【bzoj3531】 [SDOI2014]旅行
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- 11.14 T2 小x的旅行(小x的旅行)
1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...
随机推荐
- js实现23种设计模式(收藏)
js实现23种设计模式 最近在学习面向对象的23种设计模式,使用java 和 javascript 实现了一遍,但是因为目前大三,还没有比较正规的大项目经验,所以学习的过程种我觉得如果没有一定的项目经 ...
- javaweb基础(7)_HttpServletResponse原理详解
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- Silverlight日记:动态操作Grid
一,动态生成Grid public static Grid CreateGrid(List<T_METER> List) { var g = new Grid(); if (null == ...
- 深入理解ES6箭头函数的this以及各类this面试题总结
ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取this的特性,俘获了大批粉丝儿 它也可能是面试中的宠儿, 我们关键要搞清楚 箭头函数和普通函数中的this 一针见血式总结: 普通函数中的 ...
- 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
先上两张图: 查看TIME_WAIT和CLOSE_WAIT数的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a ...
- 【Linux】开放指定端口设置
这里以开放tomcat的8080端口为例 1.开放Linux的8080端口 vi /etc/sysconfig/iptables 进入编辑页面,在指定位置新增以下配置 -A INPUT -m stat ...
- 如何用 CSS 和 D3 创作旋臂粒子动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJrOqd 可交互视频 ...
- paper:synthesizable finite state machine design techniques using the new systemverilog 3.0 enhancements 之 FSM Coding Goals
1.the fsm coding style should be easily modifiable to change state encoding and FSM styles. FSM 的的 状 ...
- Altium Designer入门学习笔记1.软件安装与资料收集
一.软件安装 微信:http://url.cn/5Eudzt9 关注微信公众号"软件安装管家",点击"软件目录",弹出"软件目录",点击进入 ...
- python + selenium - selenium简介
1. 产品简介 selenium 是 基于 web网页的UI自动化测试框架. 1)支持多浏览器操作:ie.chrome.firefox.edge.safaria等 2)跨平台:windows.linu ...