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 - 不回头的旅行的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  2. vijos P1780 【NOIP2012】 开车旅行

    描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...

  3. 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 ( ...

  4. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  5. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  6. nyoj 71 独木舟上的旅行(贪心专题)

    独木舟上的旅行 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...

  7. 【bzoj3531】 [SDOI2014]旅行

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  8. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  9. 11.14 T2 小x的旅行(小x的旅行)

    1.小x的旅行   (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...

随机推荐

  1. angular设置反向代理

    本地调试,需要用到服务器的api,发现chrome安全问题,需要解决跨域问题.现给出解决方案: 1.增加proxy.conf.json文件 位置与package.json文件同级(可指定) 2.pac ...

  2. WPF DataGridCheckBoxColumn需要点两次才能修改checkbox状态

    如题,如果必须要用DataGridCheckBoxColumn使用一下方式就可以解决需要点击两次才能改状态的问题 <DataGridCheckBoxColumn> <DataGrid ...

  3. Eclipse:Win10中设置Courier New字体

    问题:在Eclipse中设置字体的时候,没有找到Courier New字体.系统为Win10. 解决:Eclipse使用的字体为系统字体.在系统字体中有一部分是隐藏的.Courier New已经在系统 ...

  4. 【细节题 离线 树状数组】luoguP4919 Marisa采蘑菇

    歧义差评:但是和题意理解一样了之后细节依然处理了很久,说明还是水平不够…… 题目描述 Marisa来到了森林之中,看到了一排nn个五颜六色的蘑菇,编号从1-n1−n,这些蘑菇的颜色分别为col[1], ...

  5. Ubuntu 开机启动不执行

    解决方案: 1.将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh"改为"#!/bin/bash" 2.将/bin/sh重新链接到/b ...

  6. java的重载(overload) (2013-10-11-163 写的日志迁移

    有以下几点: 1.方法名相同. 2.方法的 参数类型.个数.顺序至少有一项不同. 3.方法的返回类型可以不同. 4.方法的修饰符可以不同. 5.仅返回类型和修饰符不同也不可以构成重载.   ----- ...

  7. drf版本控制 django缓存

    drf的版本控制 内置的版本控制类 from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersion ...

  8. Applied Nonparametric Statistics-lec2

    Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/3 The Binomial Distributio ...

  9. python模块之sys

    sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxi ...

  10. CSS(非布局样式)

    CSS(非布局样式) 问题1.CSS样式(选择器)的优先级 1.计算权重 2.!important 3.内联样式比外嵌样式高 4.后写的优先级高 问题2.雪碧图的作用 1.减少 HTTP 请求数,提高 ...