原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ7.html

题解

这题是Unknown的弱化版。

如果这个问题出在序列上,那么显然可以CDQ分治 + 斜率优化 + 凸包上二分来做。

那么它出在树上?

点分治。

写挂了好多地方调了好久,自闭了。

代码

#pragma GCC optimize("Ofast","inline")
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')
#define outval(x) printf(#x" = %d\n",x)
#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")
#define outtag(x) puts("----------"#x"----------")
#define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\
For(_v2,L,R)printf("%d ",a[_v2]);puts("");
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=200005;
const LL INF=1e18;
int n,type;
vector <int> e[N];
int fa[N];
LL d[N],p[N],q[N],lim[N];
LL dp[N];
int size[N],mx[N];
int RT,Size;
int vis[N];
void get_root(int x,int pre){
size[x]=1,mx[x]=0;
for (auto y : e[x])
if (y!=pre&&!vis[y]){
get_root(y,x);
size[x]+=size[y];
mx[x]=max(mx[x],size[y]);
}
mx[x]=max(mx[x],Size-size[x]);
if (!RT||mx[x]<mx[RT])
RT=x;
}
struct Point{
LL x,y;
Point(){}
Point(LL _x,LL _y){
x=_x,y=_y;
}
}a[N];
int top;
vector <int> id;
LL Ask(LL p,LL lim){
if (!top)
return INF;
int L=1,R=top-1,mid;
LL ans=a[top].y-a[top].x*p;
while (L<=R){
mid=(L+R)>>1;
if (p*(a[mid].x-a[mid+1].x)>=a[mid].y-a[mid+1].y)
R=mid-1,ans=min(ans,a[mid].y-a[mid].x*p);
else
L=mid+1;
}
return ans;
}
bool cross(Point a,Point b,Point c){
return (__int128)(b.x-a.x)*(c.y-a.y)-(__int128)(c.x-a.x)*(b.y-a.y)<0;
}
void Ins(Point p){
while (top>1&&!cross(a[top-1],a[top],p))
top--;
a[++top]=p;
}
void upd_dp(int x){
dp[x]=min(dp[x],Ask(p[x],lim[x])+q[x]+p[x]*d[x]);
}
vector <int> s;
void Get(int x,int pre){
s.pb(x);
for (auto y : e[x])
if (y!=pre&&!vis[y])
Get(y,x);
}
bool cmp(int a,int b){
return lim[a]>lim[b];
}
void solve(int x){
RT=0,get_root(x,0),x=RT;
vector <int> id;
id.clear();
for (int i=x;!vis[i];i=fa[i])
id.pb(i);
vis[x]=1;
int sp=Size-size[x];
if (!vis[fa[x]]){
Size=size[fa[x]]>size[x]?sp:size[fa[x]];
solve(fa[x]);
}
for (auto y : id)
if (y!=x&&d[y]>=lim[x])
dp[x]=min(dp[x],dp[y]+p[x]*(d[x]-d[y])+q[x]);
s.clear();
for (auto y : e[x])
if (!vis[y]&&y!=fa[x])
Get(y,x);
sort(s.begin(),s.end(),cmp);
int i=0;
top=0;
for (auto x : id){
while (i<s.size()&&lim[s[i]]>d[x])
upd_dp(s[i++]);
Ins(Point(d[x],dp[x]));
}
while (i<s.size())
upd_dp(s[i++]);
for (auto y : e[x])
if (!vis[y]&&y!=fa[x]){
Size=size[y]>size[x]?sp:size[y];
solve(y);
}
}
int main(){
n=read(),type=read();
For(i,2,n){
fa[i]=read();
d[i]=read()+d[fa[i]];
p[i]=read();
q[i]=read();
lim[i]=d[i]-read();
e[i].pb(fa[i]),e[fa[i]].pb(i);
dp[i]=INF;
}
vis[0]=1,Size=n;
solve(1);
For(i,2,n)
printf("%lld\n",dp[i]);
return 0;
}

  

UOJ#7. 【NOI2014】购票 点分治 斜率优化 凸包 二分的更多相关文章

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

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

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

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

  3. UOJ#7 NOI2014 购票 点分治+凸包二分 斜率优化DP

    [NOI2014]购票 链接:http://uoj.ac/problem/7 因为太麻烦了,而且暴露了我很多学习不扎实的问题,所以记录一下具体做法. 主要算法:点分治+凸包优化斜率DP. 因为$q_i ...

  4. 【BZOJ-3672】购票 树分治 + 斜率优化DP

    3672: [Noi2014]购票 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1177  Solved: 562[Submit][Status][ ...

  5. [NOI2014]购票 「树上斜率优化」

    首先易得方程,且经过变换有 $$\begin{aligned} f_i &= \min\limits_{dist_i - lim_i \le dist_j} \{f_j + (dist_i - ...

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

    题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ...

  7. 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp

    题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...

  8. [BZOJ3672][UOJ#7][NOI2014]购票

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

  9. BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化

    BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券 ...

随机推荐

  1. \t \r \n \f

    \t 的意思是 :水平制表符.将当前位置移到下一个tab位置. \r 的意思是: 回车.将当前位置移到本行的开头. \n 的意思是:回车换行.将当前位置移到下一行的开头. \f的意思是:换页.将当前位 ...

  2. Evaluation of Forwarding Efficiency in NFV-Nodes Toward Predictable Service Chain Performance

    文章名称:Evaluation of Forwarding Efficiency in NFV-Nodes Toward Predictable Service Chain Performance 发 ...

  3. MySql存储过程 CURSOR循环

    游标 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 使用步骤 声明一个游标: declare 游标名称 CU ...

  4. IntelliJ IDEA 2018最新版注册码激活方法

    一.首先点击intellij idea 2018 二.选择激活码 三.输入以下激活码intellij idea 2018 最新版本 注册激活码 **************************** ...

  5. Python——一个简单的类的创建和应用

    1.创建类,设置属性和给属性设定默认值,设置方法并访问类的属性: 2.利用类创建多个实例,以及调用类的方法的两种办法: 3.设置更新属性的函数,并更新实例的属性. class dog(object): ...

  6. 利用crontab定时提交svn遇到的几个问题

    交待下背景...公司开发组只有技术经理有服务器和数据库权限,还只是开发环境的..因为工作安排和权限限制,测试同学上线的时候,需要本人帮开发组的部分同事review代码并把代码提交到trunk.一开始手 ...

  7. js关于“变量提升、作用域、私有作用域等知识点”高级解题思路

    var i = 2,    x = 5;var fn = function (x) {    x += 3;    return function (y) {        console.log(( ...

  8. 20155324《网络对抗技术》web安全基础实践

    20155324<网络对抗技术>web安全基础实践 实验内容 使用webgoat进行XSS攻击.CSRF攻击.SQL注入 实验问答 SQL注入攻击原理,如何防御 ①SQL注入攻击是攻击者在 ...

  9. CSS white-space属性详解

    概述 CSS的white-space属性用于指定如何处理容器中的空白字符,例如:空格( ).换行(\n).缩进(\t)等. white-space出自CSS1,适用于块状元素,具有继承性,支持IE 5 ...

  10. iTOP-4412/4418/6818开发板-fastboot烧写脚本

    在 iTOP-4412,4418,6818 开发板烧写的时候,使用的是 fastboot 工具. fastboot 工具需要在 cmd.exe 中调用,每次都需要输入烧写命令,这样步骤有点多.在程序员 ...