[Noi2014]购票
来自FallDream 的博客,未经允许,请勿转载,谢谢。
今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会。
dp式子比较容易列出来 f[i]=min f[j]+q[i]+p[i]*(d[i]-d[j)
考虑斜率优化,发现j比k优,当且仅当p<(f[j]-f[k])/(d[j]-d[k]) 所以考虑维护凸包
可以直接线段树+无旋treap 大力维护凸包
也可以cdq分治上树,每次像点分治那样做,然后用包含根的那个子树更新其它子树。
更新时候按照深度(用于更新的点直接放深度,否则放深度减去limit)排序从下往上做
复杂度nlogn^2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define MN 200000
#define INF 2000000000
using namespace std;
inline ll read()
{
ll x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} ll q[MN+],p[MN+],l[MN+],dep[MN+],f[MN+];
int n,head[MN+],cnt=,top,size[MN+],b[MN+],fa[MN+],mx[MN+],Mx[MN+];
struct edge{int to,next;ll w;}e[MN*+];
inline double Getslop(int x,int y){return !y?-INF:(double)(f[y]-f[x])/(dep[y]-dep[x]);}
struct data{int x,kind;ll dep;}a[MN+];
struct CH
{
int s[MN+],tp;
void clear() {tp=;}
void ins(int x)
{
while(tp>&&Getslop(s[tp],s[tp-])<Getslop(x,s[tp])) --tp;
s[++tp]=x;
}
int query(ll p)
{
int l=,r=tp,mid,ans;s[tp+]=;
while(l<=r)
{
mid=l+r>>;
if(Getslop(s[mid],s[mid+])<(double)p) ans=mid,r=mid-;
else l=mid+;
}
return s[ans];
}
}H;
inline void ins(int f,int t,ll w){e[++cnt]=(edge){t,head[f],w};head[f]=cnt;} void Pre(int x)
{
size[x]=;mx[x]=;
for(int i=head[x];i;i=e[i].next)
dep[e[i].to]=dep[x]+e[i].w,Pre(e[i].to),size[x]+=size[e[i].to],mx[x]=max(mx[x],size[e[i].to]);
} void GetRt(int x,int tot,int &rt)
{
size[x]=;mx[x]=;
for(int i=head[x];i;i=e[i].next)
if(!b[e[i].to]) GetRt(e[i].to,tot,rt),size[x]+=size[e[i].to],mx[x]=max(mx[x],size[e[i].to]);
Mx[x]=max(mx[x],tot-size[x]);
if(size[x]>&&Mx[x]<Mx[rt]) rt=x;
} void Dfs(int x)
{
a[++top]=(data){x,,dep[x]-l[x]};
for(int i=head[x];i;i=e[i].next)
if(!b[e[i].to]) Dfs(e[i].to);
}
bool cmp(data x,data y){return x.dep==y.dep?x.kind>y.kind:x.dep>y.dep;}
ll GetAns(int x,int y){return f[y]+p[x]*(dep[x]-dep[y])+q[x];}
void Solve(int x,int Sz)
{
if(Sz<=) return;int rt=;
GetRt(x,Sz,rt);
for(int i=head[rt];i;i=e[i].next) b[e[i].to]=;
Solve(x,Sz-size[rt]+);
a[top=]=(data){rt,,dep[rt]};
for(int t=fa[rt];t!=fa[x];t=fa[t]) a[++top]=(data){t,,dep[t]};
for(int i=head[rt];i;i=e[i].next) Dfs(e[i].to);
sort(a+,a+top+,cmp);H.clear();
for(int i=;i<=top;++i)
if(a[i].kind) H.ins(a[i].x);
else if(H.tp) f[a[i].x]=min(f[a[i].x],GetAns(a[i].x,H.query(p[a[i].x])));
for(int i=head[rt];i;i=e[i].next) Solve(e[i].to,size[e[i].to]);
} int main()
{
n=read();read();
memset(f,,sizeof(f));
for(int i=;i<=n;++i)
{
fa[i]=read();ll w=read();
p[i]=read(),q[i]=read();l[i]=read();
ins(fa[i],i,w);
}
Pre();f[]=;Mx[]=INF;Solve(,size[]);
for(int i=;i<=n;++i) printf("%lld\n",f[i]);
return ;
}
[Noi2014]购票的更多相关文章
- [BZOJ3672][UOJ#7][NOI2014]购票
[BZOJ3672][UOJ#7][NOI2014]购票 试题描述 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 480 Solved: 212[Submit][Status][D ...
- BZOJ 3672: [Noi2014]购票( 树链剖分 + 线段树 + 凸包 )
s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/ ...
- bzoj千题计划251:bzoj3672: [Noi2014]购票
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...
- [BZOJ3672][Noi2014]购票 斜率优化+点分治+cdq分治
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1749 Solved: 885[Submit][Status][ ...
- [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构
[NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...
- 【BZOJ 3672】 3672: [Noi2014]购票 (CDQ分治+点分治+斜率优化)**
3672: [Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国 ...
- 【BZOJ3672】[Noi2014]购票 树分治+斜率优化
[BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
随机推荐
- ord在python是什么意思?
>>> help(ord)Help on built-in function ord in module builtins:ord(...) #这是一个函数 ord(c) -> ...
- 大数据技术Hadoop笔试题
Hadoop有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.以下是由应届毕业生网小编J.L为您整理推荐的面试笔试题目和经验,欢迎参考阅读. 单项选择题 1. 下面哪个程序负责 H ...
- Java中三种比较常见的数组排序
我们学习数组比较常用的数组排序算法不是为了在工作中使用(这三个算法性能不高),而是为了练习for循环和数组.因为在工作中Java API提供了现成的优化的排序方法,效率很高,以后工作中直接使用即可 . ...
- WPF自学入门(十)WPF MVVM简单介绍
前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...
- JDBC操作数据库的三种方式比较
JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL. ...
- Gson解析Json数组
需求:从steam官网获取英雄数据,即为Json数据,并导入到本地数据库 Json数据是这样的 { "result": { "heroes": [ { &quo ...
- JAVA_SE基础——46.引用数据类型变量.值交换[独家深入解析]
需求:定义一个函数交换数组中两个元素的位置. code 1: import java.util.*; class Demo3 { public static void main(String[] ar ...
- href的理解
您搜索的项目暂未上线,可直接<a style="color: #ff0000;" onclick="onlineTalk();" href="j ...
- C++ 实现一个信号量
C++ 实现一个信号量 信号量有很多应用场景,事实上只要是生产者-消费者模型,一般都需要一个信号量来控制. POSIX接口是有PV信号量API的.但C++标准没有.下面是一个PV信号量的简单实现.有些 ...
- 《网络》:设置三个密码:通过console口连接设备,进入特权模式,登录Telnet
软件:Cisco Packet Tracer Instructor 软件下载链接在上一篇文章中. 内容:通过设置三个密码,熟悉采用Telnet方式配置交换机的方法. 细节说明:计算机的IP地址和交换机 ...