[UOJ430]line
首先有个暴力DP,设$s_i=\sum\limits_{j\geq i}w_j$,有$f_i=\min\limits_{l_i\lt j\leq i}f_{j-1}+s_{i+1}\max\{t_{j\cdots i}\}$
想用斜率优化,但是式中的max会随$i$改变而改变
考虑把单调栈的弹栈序列建成一棵树,每个点$x$存的直线为$y=t_xx+\min\{f_{fa_x+1\cdots x}\}$,这样一个点要查的直线就是到根路径的一条链,$l_i$的限制在最后一小段查$f$的区间最小值即可
这棵树有很好的性质,从根往下走的$t_x$是不升的,我们要查的$s_{i+1}$是递减的,所以可以树剖+线段树维护凸壳,边插入边维护即可
总时间复杂度$O(n\log^2n)$,感觉把单调栈建成树这一步非常厉害
#include<stdio.h>
#include<vector>
using namespace std;
typedef long long ll;
typedef double du;
const ll inf=1e18;
void fmin(ll&a,ll b){
if(b<a)a=b;
}
int l[100010],t[100010],w[100010],n;
ll s[100010];
int st[100010],tp;
int h[100010],nex[100010],to[100010],M;
void add(int a,int b){
M++;
to[M]=b;
nex[M]=h[a];
h[a]=M;
}
int fa[100010],siz[100010],son[100010];
void dfs(int x){
int i,k=-1;
siz[x]=1;
for(i=h[x];i;i=nex[i]){
fa[to[i]]=x;
dfs(to[i]);
siz[x]+=siz[to[i]];
if(k==-1||siz[to[i]]>siz[k])k=to[i];
}
son[x]=k;
}
int bl[100010],pos[100010],rp[100010];
void dfs(int x,int chain){
bl[x]=chain;
pos[x]=++M;
rp[M]=x;
if(~son[x])dfs(son[x],chain);
for(int i=h[x];i;i=nex[i]){
if(to[i]!=son[x])dfs(to[i],to[i]);
}
}
struct line{
ll k,b;
line(ll k=0,ll b=0):k(k),b(b){}
ll v(ll x){return k*x+b;}
};
du its(line a,line b){
return(b.b-a.b)/(du)(a.k-b.k);
}
typedef vector<line> vl;
vl g[400010];
#define ls g[g.size()-1]
void push(vl&g,line v){
if(!g.empty()&&ls.k==v.k){
if(ls.b<=v.b)return;
g.pop_back();
}
while(g.size()>1&&its(ls,g[g.size()-2])>=its(ls,v))g.pop_back();
g.push_back(v);
}
void modify(int p,line v,int l,int r,int x){
push(g[x],v);
if(l==r)return;
int mid=(l+r)>>1;
if(p<=mid)
modify(p,v,l,mid,x<<1);
else
modify(p,v,mid+1,r,x<<1|1);
}
ll get(vl&g,ll v){
while(g.size()>1&&its(ls,g[g.size()-2])>=v)g.pop_back();
return ls.v(v);
}
ll query(int L,int R,ll v,int l,int r,int x){
if(L<=l&&r<=R)return get(g[x],v);
int mid=(l+r)>>1;
ll res=inf;
if(L<=mid)fmin(res,query(L,R,v,l,mid,x<<1));
if(mid<R)fmin(res,query(L,R,v,mid+1,r,x<<1|1));
return res;
}
ll f[100010];
ll T[400010];
int N;
void build(){
for(N=1;N<=n+1;N<<=1);
for(int i=1;i<N<<1;i++)T[i]=inf;
}
void modify(int x,ll v){
T[x+=N]=v;
for(x>>=1;x;x>>=1)T[x]=min(T[x<<1],T[x<<1|1]);
}
ll query(int s,int t){
ll res=inf;
for(s+=N-1,t+=N+1;s^t^1;s>>=1,t>>=1){
if(~s&1)fmin(res,T[s^1]);
if(t&1)fmin(res,T[t^1]);
}
return res;
}
void work(int x){
int u,l,r,mid;
ll res;
modify(x,f[x-1]);
modify(pos[x],line(t[x],query(fa[x]+1,x)),1,M,1);
res=inf;
for(u=x;;){
if(::l[x]>fa[bl[u]]){
l=pos[bl[u]];
r=pos[u];
while(l<r){
mid=(l+r)>>1;
if(rp[mid]>=::l[x])
r=mid;
else
l=mid+1;
}
if(pos[u]>l)fmin(res,query(l+1,pos[u],s[x+1],1,M,1));
u=rp[l];
break;
}else{
fmin(res,query(pos[bl[u]],pos[u],s[x+1],1,M,1));
u=fa[bl[u]];
}
}
fmin(res,query(::l[x],u)+t[u]*s[x+1]);
f[x]=res;
}
int main(){
int i;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d%d",l+i,t+i,w+i);
l[i]++;
}
for(i=n;i>0;i--)s[i]=s[i+1]+w[i];
for(i=1;i<=n;i++){
while(tp&&t[i]>t[st[tp]]){
add(st[tp-1],st[tp]);
tp--;
}
st[++tp]=i;
}
for(i=1;i<=tp;i++)add(st[i-1],st[i]);
dfs(0);
M=0;
dfs(0,0);
fa[0]=-1;
build();
for(i=1;i<=n;i++)work(i);
printf("%lld",f[n]);
}
[UOJ430]line的更多相关文章
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...
- Error on line -1 of document : Premature end of file. Nested exception: Premature end of file.
启动tomcat, 出现, ( 之前都是好好的... ) [lk ] ERROR [08-12 15:10:02] [main] org.springframework.web.context.Con ...
- 关于xml加载提示: Error on line 1 of document : 前言中不允许有内容
我是在java中做的相关测试, 首先粘贴下报错: 读取xml配置文件:xmls\property.xml org.dom4j.DocumentException: Error on line 1 of ...
- Eclipse "Unable to install breakpoint due to missing line number attributes..."
Eclipse 无法找到 该 断点,原因是编译时,字节码改变了,导致eclipse无法读取对应的行了 1.ANT编译的class Eclipse不认,因为eclipse也会编译class.怎么让它们统 ...
- Linix登录报"/etc/profile: line 11: syntax error near unexpected token `$'{\r''"
同事反馈他在一测试服务器(CentOS Linux release 7.2.1511)上修改了/etc/profile文件后,使用source命令不能生效,让我帮忙看看,结果使用SecureCRT一登 ...
- [LeetCode] Line Reflection 直线对称
Given n points on a 2D plane, find if there is such a line parallel to y-axis that reflect the given ...
- [LeetCode] Tenth Line 第十行
How would you print just the 10th line of a file? For example, assume that file.txt has the followin ...
- [LeetCode] Max Points on a Line 共线点个数
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- "Installation failed !" in GUI but not in CLI (/usr/bin/winusb: line 78: 18265 Terminated )
"Installation failed !" in GUI but not in CLI (/usr/bin/winusb: line 78: 18265 Terminated ...
随机推荐
- mybatis的配置文件中<selectKey>标签问题
1.mybatis的配置文件中,使用sequence生成主键 未执行add方法之前,主键未生成(null):刚执行add之后,主键即生成(212) 这里的重点是,一旦执行add方法,配置文件中的sel ...
- C#事件实现文件下载时进度提醒
C#中的事件是建立在委托的基础上,标准的事件模型应该包括以下几点: 声明一个用于定义事件的委托,这里用系统自带的泛型委托原型EventHandler<TEventArgs>,如:publi ...
- EPC摘抄
S6a MME – HSS 完成用户位置信息的交换和用户签约信息的管理,传送控制面信息 Diameter MME:主要负责信令处理及移动性管理,功能包括:NAS信令及其安全:跟踪区域(Tracking ...
- 六、springcloud之配置中心Config
一.配置中心提供的核心功能 Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对S ...
- 编写组件TComponent published $M+ 问题
报错如下: PUBLISHED caused RTTI ($M+) to be added to type 修改成下面这样之后: 解决问题 方法: 来自:http://www.cnblogs.com/ ...
- HDU 1068 Girls and Boys(最大独立集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 题目大意:有n个人,一些人认识另外一些人,选取一个集合,使得集合里的每个人都互相不认识,求该集合 ...
- JAVA复习笔记分布式篇:zookeeper
前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能: 概念:ZooK ...
- 深度学习国外课程资料(Deep Learning for Self-Driving Cars)+(Deep Reinforcement Learning and Control )
MIT(Deep Learning for Self-Driving Cars) CMU(Deep Reinforcement Learning and Control ) 参考网址: 1 Deep ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- 微信小程序地图模块
微信小程序的地图模块官方提供的API比较少,详情请见 官方文档 以下为一个示例 <!--pages/location/locati ...