BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
Description
Input
第 1 行包含2个非负整数 n,t,分别表示城市的个数和数据类型(其意义将在后面提到)。输入文件的第 2 到 n 行,每行描述一个除SZ之外的城市。其中第 v 行包含 5 个非负整数 f_v,s_v,p_v,q_v,l_v,分别表示城市 v 的父亲城市,它到父亲城市道路的长度,票价的两个参数和距离限制。请注意:输入不包含编号为 1 的SZ市,第 2 行到第 n 行分别描述的是城市 2 到城市 n。
Output
输出包含 n-1 行,每行包含一个整数。其中第 v 行表示从城市 v+1 出发,到达SZ市最少的购票费用。同样请注意:输出不包含编号为 1 的SZ市。
Sample Input
1 2 20 0 3
1 5 10 100 5
2 4 10 10 10
2 9 1 100 10
3 5 20 100 10
4 4 20 0 10
Sample Output
150
70
149
300
150
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long ll;
#define N 200050
typedef double f2;
int head[N],to[N],nxt[N],fa[N],n,cnt,mx[N],tot,root,siz[N],S[N],top,vis[N];
ll val[N],dep[N],P[N],Q[N],L[N],f[N];
int a[N],b[N],la,lb;
inline void add(int u,int v,ll w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
bool cmp1(const int &x,const int &y) {
return dep[x]-L[x]>dep[y]-L[y];
}
f2 K(int i,int j) {
return (f2(f[i]-f[j]))/(dep[i]-dep[j]);
}
void dfs(int x) {
int i; siz[x]=1;
for(i=head[x];i;i=nxt[i]) {
dep[to[i]]=dep[x]+val[i];
dfs(to[i]);
siz[x]+=siz[to[i]];
}
}
void get_root(int x) {
int i;
siz[x]=1; mx[x]=0;
for(i=head[x];i;i=nxt[i]) if(!vis[to[i]]) {
get_root(to[i]);
siz[x]+=siz[to[i]];
mx[x]=max(mx[x],siz[to[i]]);
}
mx[x]=max(mx[x],tot-siz[x]);
if(mx[root]>mx[x]) root=x;
}
void diu1(int x,int y) {
int p;
for(p=x;p!=fa[y];p=fa[p]) a[++la]=p;
}
void diu2(int x) {
int i; b[++lb]=x;
for(i=head[x];i;i=nxt[i]) if(!vis[to[i]]) {
diu2(to[i]);
}
}
void solve(int x) {
tot=siz[x]; root=0; get_root(x); int rt=root; vis[rt]=1;
//printf("%d %d\n",x,rt);
if(x!=rt) siz[x]-=siz[rt],solve(x);
la=lb=0;
int i,j;
diu1(rt,x);
for(i=head[rt];i;i=nxt[i]) if(!vis[to[i]]) {
diu2(to[i]);
}//printf("%d %d\n",la,lb);
for(i=2;i<=la;i++) if(dep[rt]-dep[a[i]]<=L[rt]) f[rt]=min(f[rt],f[a[i]]+(dep[rt]-dep[a[i]])*P[rt]+Q[rt]); sort(b+1,b+lb+1,cmp1); top=0,S[0]=0;
for(j=1,i=1;i<=lb;i++) {
int u=b[i];
while(j<=la&&dep[u]-dep[a[j]]<=L[u]) {
while(top>1&&K(S[top],a[j])>K(S[top-1],S[top])) top--;
S[++top]=a[j++];
}
if(!top) continue;
if(top==1) f[u]=min(f[u],f[S[1]]+(dep[u]-dep[S[1]])*P[u]+Q[u]);
else {
int l=1,r=top;
while(l<r) {
int mid=(l+r)>>1;
if(P[u]>K(S[mid],S[mid+1])) r=mid;
else l=mid+1;
}
f[u]=min(f[u],f[S[l]]+(dep[u]-dep[S[l]])*P[u]+Q[u]);
}
} for(i=head[rt];i;i=nxt[i]) if(!vis[to[i]]) {
solve(to[i]);
}
}
int main() {
mx[0]=1<<30;
scanf("%d%*d",&n);
int i;
ll x;
for(i=2;i<=n;i++) {
scanf("%d%lld%lld%lld%lld",&fa[i],&x,&P[i],&Q[i],&L[i]); add(fa[i],i,x);
}
memset(f,0x3f,sizeof(f));
f[1]=0;
dfs(1);
solve(1);
for(i=2;i<=n;i++) printf("%lld\n",f[i]);
}
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化的更多相关文章
- 【BZOJ3672】[Noi2014]购票 树分治+斜率优化
[BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- UOJ#7. 【NOI2014】购票 点分治 斜率优化 凸包 二分
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ7.html 题解 这题是Unknown的弱化版. 如果这个问题出在序列上,那么显然可以CDQ分治 + 斜率 ...
- 【BZOJ-3672】购票 树分治 + 斜率优化DP
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1177 Solved: 562[Submit][Status][ ...
- [NOI2014]购票 「树上斜率优化」
首先易得方程,且经过变换有 $$\begin{aligned} f_i &= \min\limits_{dist_i - lim_i \le dist_j} \{f_j + (dist_i - ...
- BZOJ3672 [Noi2014]购票 【点分治 + 斜率优化】
题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ...
- 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp
题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...
- BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化
BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券 ...
- BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)
BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...
- [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)
[BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...
随机推荐
- Leet Code OJ 237. Delete Node in a Linked List [Difficulty: Easy]
题目: Write a function to delete a node (except the tail) in a singly linked list, given only access t ...
- mongo 的逻辑存储和物理存储
逻辑存储空间与物理存储空间有差距的主要原因 存储引擎存储时,需要记录一些额外的元数据信息,这会导致物理空间总和比逻辑空间略大 存储引擎可能支持数据压缩,逻辑的数据块存储到磁盘时,经过压缩可能比逻辑数据 ...
- Python学习总结之五 -- 入门函数式编程
函数式编程 最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转. 今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见 ...
- POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8301 Accepted: 3 ...
- EasyDSS RTMP流媒体服务器web前端:vue组件之间的传值,父组件向子组件传值
之前接触最多的都是EasyNVR,主要针对的都是前端的一些问题.也有接触到一些easydss流媒体服务器. 前端方面的,EasyDSS流媒体服务器与EasyNVR有着根本的不同.EasyNVR使用的是 ...
- sqlite与sqlserver区别
1.查询时把两个字段拼接在一起 --sqlserver-- select Filed1+'@'+Filed2 from table --sqlite-- select Filed1||'@'||Fil ...
- Easyui combobox 怎么加载数据
说明:开发环境 vs2012 asp.net mvc4 c# 1.效果图 2.HTML代码 <%@ Page Language="C#" AutoEventWireup=&q ...
- 九度OJ 1176:树查找 (完全二叉树)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5209 解决:2193 题目描述: 有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY.该树是完全二叉树. 输入: 输入 ...
- Nodejs学习笔记 --- 调用命令方法ld_process.exec()和child_process.execFile()
本文主要记录项目中使用NodeJS实现在线构建项目时,通过代码自动调用命令行. 参考资料&内容来源: Nodejs官网:http://nodejs.cn/api/child_process.h ...
- 安装postgresql碰到Unable to write inside TEMP environment path
搞了半天,原来是 AVAST搞的鬼,把原来注册表的键值改成它自己了.其实应该是 C:\Windows\System32\vbscript.dll The answer in the following ...