UOJ#7. 【NOI2014】购票 点分治 斜率优化 凸包 二分
原文链接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】购票 点分治 斜率优化 凸包 二分的更多相关文章
- BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...
- 【BZOJ3672】[Noi2014]购票 树分治+斜率优化
[BZOJ3672][Noi2014]购票 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- UOJ#7 NOI2014 购票 点分治+凸包二分 斜率优化DP
[NOI2014]购票 链接:http://uoj.ac/problem/7 因为太麻烦了,而且暴露了我很多学习不扎实的问题,所以记录一下具体做法. 主要算法:点分治+凸包优化斜率DP. 因为$q_i ...
- 【BZOJ-3672】购票 树分治 + 斜率优化DP
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1177 Solved: 562[Submit][Status][ ...
- [NOI2014]购票 「树上斜率优化」
首先易得方程,且经过变换有 $$\begin{aligned} f_i &= \min\limits_{dist_i - lim_i \le dist_j} \{f_j + (dist_i - ...
- BZOJ3672 [Noi2014]购票 【点分治 + 斜率优化】
题目链接 BZOJ3672 题解 如果暂时不管\(l[i]\)的限制,并假使这是一条链 设\(f[i]\)表示\(i\)节点的最优答案,我们容易得到\(dp\)方程 \[f[i] = min\{f[j ...
- 【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 ...
- [BZOJ3672][UOJ#7][NOI2014]购票
[BZOJ3672][UOJ#7][NOI2014]购票 试题描述 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. ...
- BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化
BZOJ_1492_[NOI2007]货币兑换Cash_CDQ分治+斜率优化 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券 ...
随机推荐
- C++: 模板函数定义与声明分离;
我们知道模板函数或模板类的定义一般都是和声明一起在头文件中,但是这样的话, 就暴露了内部实现,有什么办法能够将定义和声明进行分离呢? 答案是: 有的: 头文件: test.h; class test ...
- 一、docker的原理
一.docker解决什么问题: 高效的利用资源 应用之间相互隔离 应用之间不能发生资源抢占,每个应用只能使用事先注册申请的资源. 环境封装,利于迁移 二.docker的原理: 1.Namespaces ...
- 001 Nibiru SDK 调试工具介绍
为方便调试 Unity 项目,Nibiru 提供调试工具用于模拟手柄键值或直连主机手 柄 要求:Unity 开发环境和调试工具运行在同一台电脑上 Nibiru SDK 调试工具主要用于开发过程中对操控 ...
- 08--STL关联容器(set/multiset)
一:set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...
- ReactJS虚拟DOM效应带来的一则副作用探索
疑问 https://github.com/ruanyf/react-demos/blob/master/demo08/index.html 在如下代码中的 18 行, 需要将本类中的 方法,进行绑定 ...
- 开源顶级持久层框架——mybatis(ibatis)——day01
mybatis-day01 1.对原生态jdbc程序中的问题总结 1.1环境 java环境:jdk eclipse:indigo ...
- Mongodb复杂查询,总结
内嵌文档复杂查询 数据结构 { "_id":"1412243", "info":{ "data":[ { "b ...
- 机器学习用Pandas实现数据库的读取
#读取数据库数据#import pandas as pd 导入模块#import pymysql 导入数据库模块#con = pymysql.connect(host='localhost',po ...
- elk的备份与恢复【转】
elasticsearch提供了快照功能: 1.在elsticsearch的配置文件中定义一个path.repo路径配置 path.repo: ["/elk/my_backup"] ...
- pwnable.tw hacknote
产生漏洞的原因是free后chunk未置零 unsigned int sub_80487D4() { int index; // [esp+4h] [ebp-14h] char buf; // [es ...