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;
}

  

转载于:https://www.cnblogs.com/ezyzy/p/6690673.html

bzoj 3672 购票 点分治+dp相关推荐

  1. BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治

    2244: [SDOI2011]拦截导弹 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度.并且能够拦截 ...

  2. [luogu 4292][bzoj 1758][WC2010] 重建计划(点分治 + dp + 单调队列优化 + 启发式合并)

    [WC2010]重建计划 problem solution code problem 洛谷指路 solution 一看那个道路平均价值的式子:AvgValue=∑e∈Sv(e)∣S∣\text{Avg ...

  3. BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...

  4. 1049 Counting Ones (30 分)【难度: 难 / 知识点: 分治 / DP】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805430595731456 方法一: 找规律,分治做法. //0-999 ...

  5. Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

    传送门 题意: 有一颗nnn个节点的树,其中一个简单路径集合被称为kkk合法当且仅当: 树的每个节点至多属于一条路径,且每条路径恰好包含kkk个点. 对于k∈[1,n]k\in [1,n]k∈[1,n ...

  6. [HDU 6643] Ridiculous Netizens(点分治+根号分治+dp)

    HDU 6643 Ridiculous Netizens problem hdu6643 题目大意:给定一棵无根树,以及每个点的点权 wiw_iwi​. 定义一个连通块的价值为连通块内点的点权之积. ...

  7. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构 ...

  8. [线段树分治][DP] LOJ #534. 「LibreOJ Round #6」花团

    Solution S o l u t i o n Solution 操作相当于是动态的做一个背包DP. 离线的话,线段树分治一下. 因为结尾是已知的,可以一边分治,得到一个修改操作,就插到线段树. 只 ...

  9. Leetcode天池大赛压轴题分治dp

    LeetCode天池大赛第四题 根据题意,有一个重要结论,就是很多数组,我要么不拿,要么拿完 至多只剩下一个未拿完的序列 枚举每个序列作为结束序列,也就是未拿完序列 如果直接01背包将会是n方级别 那 ...

  10. bzoj 4455: [Zjoi2016]小星星 树形dp+容斥原理

    题意 给出一棵树和一个图,问有多少种方法把树的节点标号使得其在改图中至少有一棵生成树与原来的树是重构的. n<=17 分析 想到了容斥,但是没想到从哪里容斥... 显然题目给了两个限制,一个是原 ...

最新文章

  1. 判断android应用程序是否已安装
  2. mysql for Mac 下创建数据表中文显示为?的解决方法
  3. SqlAlchemy个人学习笔记完整汇总
  4. ArrayBlockingQueue跟LinkedBlockingQueue的区别
  5. Python input 函数 -Python零基础入门教程
  6. (ssh整合web导出excel)在ssh框架中使用poi正确导出具有比较高级固定格式的excel 整体过程,查询导出前后台下载...
  7. 精通RPM之--制作篇(rpmbuild)
  8. java xmladapte_java – Jaxb:全局绑定使用XMLAdapter进行双...
  9. Beta版本冲刺———第二天
  10. Unity3D 去色Shader实现
  11. 【C语言】C语言入门经典题目(范围广,内容多)
  12. 2个阶乘什么意思_两个阶乘号是什么意思,-双阶乘-数学-滕诓芳同学
  13. 猎人华为单机离线版(一键启动增强版+扩展工具箱2022) | 猎人维修大师免加密狗单机永久版 | 华为线刷工具(MRT HW Flash Tool) | 华为工具(MRT HW Tool_V3.3)
  14. mysql建表语句转换成oracle,如何手动将ORACLE的sql建表语句转换为MYSQL的建表语句...
  15. 数据分析 超市条码_超市卖场管理四要素!走好千里之行的第一步!
  16. 宜家开发中心东亚区完成在中国的全新升级;牙科巨头卡瓦集团上海创新卓越中心正式启动 | 美通企业日报...
  17. 在Linux命令行中操作PDF
  18. SpringBoot进阶(十)整合Shiro上篇
  19. docker安装包在linux上部署安装
  20. linux 同步套件,为Linux安装套件强化系统安全

热门文章

  1. MBR、主引导扇区,主分区、扩展分区、逻辑分区,活动分区、引导分区、系统分区、启动分区的区别详解
  2. Python进阶(四)Python中的异常
  3. 控制系统数字仿真与CAD-第三次实验-附完整代码
  4. python将txt文档中的内容按字母顺序进行排序,并存入txt中
  5. 求解偏微分方程开源有限元软件deal.II学习--Step 10
  6. Git-版本控制 (二)
  7. mybatis 中的![CDATA[ ]]
  8. MySQL 5.7安装(多实例)最佳实践
  9. 快速部署简单私有云CloudStack(下)
  10. code4906 删数问题