3672: [Noi2014]购票

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 1177  Solved: 562
[Submit][Status][Discuss]

Description

 今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会。
       全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的 n 个城市用 1 到 n 的整数编号。其中SZ市的编号为 1。对于除SZ市之外的任意一个城市 v,我们给出了它在这棵树上的父亲城市 fv  以及到父亲城市道路的长度 sv
从城市 v 前往SZ市的方法为:选择城市 v 的一个祖先 a,支付购票的费用,乘坐交通工具到达 a。再选择城市 a 的一个祖先 b,支付费用并到达 b。以此类推,直至到达SZ市。
对于任意一个城市 v,我们会给出一个交通工具的距离限制 lv。对于城市 v 的祖先 a,只有当它们之间所有道路的总长度不超过 lv  时,从城市 v 才可以通过一次购票到达城市 a,否则不能通过一次购票到达。对于每个城市 v,我们还会给出两个非负整数 pv,qv  作为票价参数。若城市 v 到城市 a 所有道路的总长度为 d,那么从城市 v 到城市 a 购买的票价为 dpv+qv
每个城市的OIer都希望自己到达SZ市时,用于购票的总资金最少。你的任务就是,告诉每个城市的OIer他们所花的最少资金是多少。
 
 
列出dp方程后是一个很简单的斜率优化的形式,需要维护右下凸壳,转移的时候在上边二分。(开始的时候脑子不清醒先写了个左下凸壳又改成了左上凸壳)
我们可以类似CDQ分治用点分治来处理转移。
每回找到重心后先递归处理深度比较浅的那部分,处理浅的和重心对深的的影响,在处理深的一部分(如同CDQ求LIS,先递归左半边再处理转移)。
反正我是每回求完浅的部分后暴力求了一下重心的f。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ll long long
#define inf 1e17
#define N 200005
using namespace std;
int n,t;
int head[N],ver[N*2],nxt[N*2],tot;
ll quan[N*2];
void add(int a,int b,ll c)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;quan[tot]=c;return ;
}
int fa[N],d[N];
ll s[N],p[N],q[N],l[N],dep[N],f[N];
void dfs(int x,int ff)
{
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==ff)continue;
dep[ver[i]]=dep[x]+quan[i];
d[ver[i]]=d[x]+1;
dfs(ver[i],x);
}
return ;
}
int mn,zhong;
int size[N],now,v[N];
void dffs(int x,int ff)
{
int mx=0;size[x]=1;
for(int i=head[x];i;i=nxt[i])
{
if(v[ver[i]]||ver[i]==ff)continue;
dffs(ver[i],x);
size[x]+=size[ver[i]];
if(size[ver[i]]>mx)mx=size[ver[i]];
}if(now-size[x]>mx)mx=now-size[x];
if(mx<mn)mn=mx,zhong=x;
return ;
}
int tp[N],top;
void dfss(int x,int ff)
{
for(int i=head[x];i;i=nxt[i])
{
if(v[ver[i]]||ver[i]==ff)continue;
tp[++top]=ver[i];
dfss(ver[i],x);
}
}
bool cmp(int x,int y)
{
return dep[x]-l[x]>dep[y]-l[y];
}
int g[N];int as[N],cnt;
double cj(ll x,ll y,ll xx,ll yy)
{
return (double)x*yy-(double)y*xx;
}
double xie[N];
void dp()
{
int pt=1;int r=0;
for(int i=1;i<=top;i++)
{
int x=tp[i];
while(pt!=cnt+1&&dep[x]-l[x]<=dep[as[pt]])
{
while(r>1&&cj(dep[as[g[r]]]-dep[as[pt]],f[as[g[r]]]-f[as[pt]],dep[as[g[r-1]]]-dep[as[pt]],f[as[g[r-1]]]-f[as[pt]])<=0)r--;
g[++r]=pt;
if(r!=1)xie[r]=(double)(f[as[pt]]-f[as[g[r-1]]])/(double)(dep[as[pt]]-dep[as[g[r-1]]]);
pt++;
}xie[1]=1e100;
if(!r)continue;
int ha=1,ta=r;
while(ha<=ta)
{
int mid=(ha+ta)>>1;
if(xie[mid]>=p[x])ha=mid+1;
else ta=mid-1;
}
f[x]=min(f[x],f[as[g[ta]]]+(dep[x]-dep[as[g[ta]]])*p[x]+q[x]);
}
}
int id;
void ds(int x,int ff)
{
size[x]=1;if(d[x]<mn)mn=d[x],id=x;
for(int i=head[x];i;i=nxt[i])
{
if(ver[i]==ff||v[ver[i]])continue;
ds(ver[i],x);
size[x]+=size[ver[i]];
}
}
void solve(int x)
{
now=size[x];mn=n+1;zhong=x;
dffs(x,-1);
int root=zhong;v[root]=1;mn=n+1;
ds(root,-1);int pp=id;
for(int i=head[root];i;i=nxt[i])
{
if(!v[ver[i]]&&ver[i]==fa[root])solve(ver[i]);
}
cnt=0;as[++cnt]=root;
for(int i=fa[root];i!=fa[pp];i=fa[i])
{
as[++cnt]=i;
if(dep[root]-dep[i]<=l[root])f[root]=min(f[root],f[i]+(dep[root]-dep[i])*p[root]+q[root]);
}
top=0;
dfss(root,-1);
sort(tp+1,tp+top+1,cmp);
dp();
for(int i=head[root];i;i=nxt[i])
{
if(!v[ver[i]])solve(ver[i]);
}
return ;
}
int main()
{
scanf("%d%d",&n,&t);
for(int i=2;i<=n;i++)
{
scanf("%d%lld%lld%lld%lld",&fa[i],&s[i],&p[i],&q[i],&l[i]);
add(fa[i],i,s[i]);add(i,fa[i],s[i]);
}
for(int i=2;i<=n;i++)f[i]=inf;
d[1]=1;dfs(1,-1);
size[1]=n;solve(1);
for(int i=2;i<=n;i++)
{
printf("%lld\n",f[i]);
}
return 0;
}

  

 

bzoj 3672 购票 点分治+dp的更多相关文章

  1. BZOJ 3672 购票

    Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国\(n\)个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与 ...

  2. [BZOJ]3672 购票(Noi2014)

    革命尚未成功,同志还需努力. Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ ...

  3. bzoj 3672 利用点分治将CDQ分治推广到树型结构上

    最大的收获就是题目所说. deal(s) : 处理节点s所在块的问题,并保证: 1.s是该块中最靠近根节点的点,没有之一. 2.s所在块到根节点的路径上的点全都用来更新过了s所在块的所有节点. 然后步 ...

  4. ●BZOJ 3672 [Noi2014]购票

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3672 题解: 斜率优化DP,点分治(树上CDQ分治...) 这里有一个没有距离限制的简单版: ...

  5. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  6. BZOJ 4518 [Sdoi2016]征途(分治DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] ...

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

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

  8. [BZOJ 4332] [JSOI2012]分零食(DP+FFT)

    [BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...

  9. HDU 3507 Print Article(CDQ分治+分治DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3507 [题目大意] 将长度为n的数列分段,最小化每段和的平方和. [题解] 根据题目很容易得到dp ...

随机推荐

  1. python-两个筛子数据可视化(直方图)

    """ 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...

  2. jQuery的基本使用

    一.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动 ...

  3. 2018-2019-20172321 《Java软件结构与数据结构》第六周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第六周学习总结 教材学习内容总结 第10章 树 10.1概述 树由一个包含结点和边的集构成,其中的元素被储存在这些结点中 ...

  4. 20172321 2017-2018-2 《Java程序设计》第二周学习总结

    20172321 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第一章要点: 要点1 字符串:print和println用法的区别,字符串的拼接,java中 ...

  5. c# 写文件注意问题及用例展示

    以txt写string举例,正确代码如下: private void xie() { FileStream fs = new FileStream("1.txt", FileMod ...

  6. selenium之鼠标事件

    1.鼠标悬停火狐版本51,selenium版本3ActionChains(driver).move_to_element(above).perform()执行代码时,报错:selenium.commo ...

  7. Task 4 求数组的连续子数组的最大和(团队合作)

    小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...

  8. 关于react虚拟DOM的研究

    1.传统的前端是这样的,我在学校也都是这样做的,html(jsp)主要负责提供所有的DOM节点,而javascript负责动态效果,比如按钮点击,图片轮播等,这样的话javascript如何组织结构是 ...

  9. System 类的使用

    /*System 系统类 主要用于获取系统的属性数据.System类常用的方法: arraycopy(Object src, int srcPos, Object dest, int destPos, ...

  10. 项目Beta冲刺(团队)第六天

    1.昨天的困难 可以获得教务处通知栏的15条文章数据了,但是在显示的时候出了问题. 私信聊天的交互还没研究清楚 2.今天解决的进度 成员 进度 陈家权 研究私信模块 赖晓连 研究问答模块 雷晶 研究服 ...