http://uoj.ac/problem/7 (题目链接)

题意

  给出一棵有根树,每次从一个节点出发可以买票到达它的一定范围内的祖先。问对于每一个点,到达根的最小花费是多少。

Solution

  右转题解→_→:LCF

  一些细节自己YY一下就好,看看代码也行。

细节

  最好写读入优化?

代码

// uoj7
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline LL gi() {
LL x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch<='9' && ch>='0') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=200010;
int n,T,cnt,a[maxn],par[maxn],head[maxn];
LL d[maxn],Q[maxn],P[maxn],L[maxn],ans[maxn]; struct node {LL w;int num;}t[maxn];
struct edge {int to,next;}e[maxn<<1]; namespace DP {
int l,r,q[maxn];
void Clear() {l=1,r=0;}
double slope(int i,int j) {
return (double)(ans[i]-ans[j])/(d[i]-d[j]);
}
void push(int x) {
while (l<r && slope(q[r-1],q[r])<slope(x,q[r])) r--;
q[++r]=x;
}
void update(int x) {
if (l>r) return;
int ll=l,rr=r,y;
while (ll<=rr) {
int mid=(ll+rr)>>1;
if (ll<mid && slope(q[mid-1],q[mid])<P[x]) y=mid,rr=mid-1;
else if (rr>mid && slope(q[mid],q[mid+1])>P[x]) y=mid,ll=mid+1;
else {y=mid;break;}
}
y=q[y];
ans[x]=min(ans[x],ans[y]+(d[x]-d[y])*P[x]+Q[x]);
}
}
using namespace DP; namespace NodeDivide {
int size[maxn],f[maxn],vis[maxn];
int Dargen,sum,dfn;
bool cmp(node a,node b) {
return a.w>b.w;
}
void caldargen(int x,int fa) {
size[x]=1;f[x]=0;
for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa && !vis[e[i].to]) {
caldargen(e[i].to,x);
size[x]+=size[e[i].to];
f[x]=max(f[x],size[e[i].to]);
}
f[x]=max(f[x],sum-size[x]);
if (f[x]<f[Dargen]) Dargen=x;
}
void dfs(int x,int fa) {
a[++dfn]=x;
for (int i=head[x];i;i=e[i].next) if (e[i].to!=fa && !vis[e[i].to]) dfs(e[i].to,x);
}
void work(int x) {
vis[x]=1;
if (!vis[par[x]]) {
sum=size[par[x]];
Dargen=0;caldargen(par[x],x);
work(Dargen);
}
Clear();
for (int j=par[x];!vis[j] && d[x]-d[j]<=L[x];j=par[j]) push(j);
update(x);
dfn=0;
for (int i=head[x];i;i=e[i].next)
if (!vis[e[i].to] && e[i].to!=par[x]) dfs(e[i].to,x);
for (int i=1;i<=dfn;i++) t[i]=(node){d[a[i]]-L[a[i]],a[i]};
sort(t+1,t+1+dfn,cmp);
Clear();
for (int j=x,i=1;i<=dfn;i++) {
for (;(!vis[j] || j==x) && t[i].w<=d[j];j=par[j]) push(j);
update(t[i].num);
}
for (int i=head[x];i;i=e[i].next) if (e[i].to!=par[x] && !vis[e[i].to]) {
sum=size[e[i].to],Dargen=0;
caldargen(e[i].to,x);
work(Dargen);
}
vis[x]=0;
}
void Init() {
f[Dargen=0]=1<<30;
sum=n;vis[0]=1;
caldargen(1,0);
work(Dargen);
}
} void link(int u,int v) {
e[++cnt]=(edge){v,head[u]};head[u]=cnt;
e[++cnt]=(edge){u,head[v]};head[v]=cnt;
}
int main() {
n=gi(),T=gi();
for (int i=2;i<=n;i++) {
par[i]=gi(),d[i]=gi(),P[i]=gi(),Q[i]=gi(),L[i]=gi();
d[i]+=d[par[i]];ans[i]=inf;link(i,par[i]);
}
NodeDivide::Init();
for (int i=2;i<=n;i++) printf("%lld\n",ans[i]);
return 0;
}

【uoj7】 NOI2014—购票的更多相关文章

  1. BZOJ3672/UOJ7 [Noi2014]购票

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. [BZOJ3672][UOJ#7][NOI2014]购票

    [BZOJ3672][UOJ#7][NOI2014]购票 试题描述  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  3. bzoj 3672: [Noi2014]购票 树链剖分+维护凸包

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 480  Solved: 212[Submit][Status][D ...

  4. BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )

    s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/ ...

  5. bzoj千题计划251:bzoj3672: [Noi2014]购票

    http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...

  6. [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1749  Solved: 885[Submit][Status][ ...

  7. [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构

    [NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...

  8. 【BZOJ 3672】 3672: [Noi2014]购票 (CDQ分治+点分治+斜率优化)**

    3672: [Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国 ...

  9. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  10. BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化

    BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...

随机推荐

  1. IDEA创建Scala项目

    一.安装插件 见Scala入门篇 二.新建项目 选择new project,其中SBT相当于精简版的maven,其他的待补充.这里选择IDEA 填写信息,选择Scala SDK 在src目录下新建Sc ...

  2. WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。

    原文:WPF编程,使用WindowChrome实现自定义窗口功能的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/arti ...

  3. WPF编程,窗口保持上次关闭时的大小与位置。

    原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...

  4. 2017战略No.2:开始电子化记账

    一.懒散的4年 大学毕业后,就没有怎么记账了. 自己花的钱,心里有个大概,但是不能算得很具体. 比如说,2016年,又没有攒几个钱,心里多少有点压抑. 大脑去算账,只能算房租吃饭等金额较大的开销,更多 ...

  5. Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法

    #define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0) #define _IOR(type,nr,size)    _IOC(_IOC_RE ...

  6. libgdx学习记录20——多线程MultiThread资源处理

    在libgdx中,一般的逻辑流程都在rende()函数中执行,这个函数是由opengl的渲染线程调用的,一般的图形显示和逻辑处理都在这个线程中. 一般情形下,在这个线程中处理就行了.但是当某些逻辑处理 ...

  7. CS190.1x-ML_lab3_linear_reg_student

    这次作业主要是有关监督学习,数据集是来自UCI Machine Learning Repository的Million Song Dataset.我们的目的是训练一个线性回归的模型来预测一首歌的发行年 ...

  8. MyBatis的一级缓存和二级缓存简介笔记

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  9. dubbo见解

    调用关系说明 服务容器负责启动,加载,运行服务提供者. 服务提供者在启动时,向注册中心注册自己提供的服务. 服务消费者在启动时,向注册中心订阅自己所需的服务. 注册中心返回服务提供者地址列表给消费者, ...

  10. 七个要素帮你打造现象级手游!优化程度堪比《QQ飞车》

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由WeTest质量开放平台团队发表于云+社区专栏 作者:申江涛,腾讯互娱客户端工程师 商业转载请联系腾讯WeTest获得授权,非商业转载 ...