[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( ...
随机推荐
- HTTP协议以及HTTP2.0/1.1/1.0区别
HTTP协议以及HTTP2.0/1.1/1.0区别 一.简介 摘自百度百科: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所 ...
- python 面向对象设计思想发展史
这篇主要说的是程序设计思想发展历史,分为概述和详细发展历史 一,概述 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的 指令和数 据.简单来 ...
- postcss的安装与使用
我是经过公司另外一个同事推荐的这个 他是一个资深的大哥哥 我觉得我确实需要跟多的学习和成长 而且我觉得我应该听他的话 多学学新知识 最近一直在做适配的网站 会出现很多媒体查询 我发现用这个写媒体查询 ...
- 偶遇vue-awesome-swiper的坑
最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...
- auto_prepend_file与auto_append_file使用方法
auto_prepend_file与auto_append_file使用方法 如果需要将文件require到所有页面的顶部与底部. 第一种方法:在所有页面的顶部与底部都加入require语句. 例如: ...
- PHP之this和self
self在对象中自己调用自己使用 $this在实例化后使用$this方法 在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就 ...
- unity3D 知识点随手记
最近闲来无事,记记unity3D相关的一些知识点吧,也当作笔记存储.转载请标明出处:http://www.cnblogs.com/zblade/ 1.unity是如何调用Start/Awake等相关函 ...
- zuul入门(4)zuul的注解@EnableZuulServer和@EnableZuulProxy
@EnableZuulServer.@EnableZuulProxy两个注解 @EnableZuulProxy简单理解为@EnableZuulServer的增强版,当Zuul与Eureka.Ribbo ...
- apigw鉴权分析(1-3)百度 AI - 鉴权方式分析
http://ai.baidu.com/docs#/Begin/top 一.访问入口 二.鉴权方式分析 1.鉴权认证方式一 - access_token - 针对HTTP API调用者 2.鉴权认证方 ...
- 粒子系统(二):Canvas绘制精美图案
准备 IDE:Visual Studio Code Language:JavaScript / ECMAScript 6+ GitHub:Natural2D.JS 本文主要讲述 Particles - ...