bzoj3672:[noi2014]购票

Boss.Pi Boss.Pi     2022-10-09     610

关键词:

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他们所花的最少资金是多少。

Solution

这题坑死我了
正解:斜率优化DP
容易推出 (f[i]=f[v]+(dis[i]-dis[v])*p[i]+q[i]) (v)为某个祖先
化成斜率优化的形式:(f[v]=dis[v]*p[i]+f[i]-q[i]-dis[i]*p[i])
所以相当于使用 (k=p[i],b=f[i]-q[i]+dis[i]*p[i]) 的直线去割若干个点 ((dis[v],f[v]))
因为转移是在父子之间的,所以可以分治.
1.首先递归父亲所在块
2.用父亲所在的块更新所有儿子所在的块
3.递归处理所有的儿子
更新的方式大致是:
儿子按 (dis[i]-l[i]) 排序,把符合要求的点加入,维护凸包(然而大佬们都是半平面交),三分合适的斜率.
口胡完了,实现也比较简单

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200005;
int TT,head[N],num=0,nxt[N<<1],to[N<<1];ll c[N<<1];
ll dis[N],p[N],q[N],lim[N],inf;int n,fa[N];bool vis[N];
inline void link(int x,int y,ll z){
    nxt[++num]=head[x];to[num]=y;c[num]=z;head[x]=num;
}
int sz[N],son[N]={N},sum,rt;
inline void getroot(int x,int last){
    sz[x]=1;son[x]=0;
    for(int i=head[x];i;i=nxt[i]){
        int u=to[i];
        if(vis[u] || u==last)continue;
        getroot(u,x);
        sz[x]+=sz[u];son[x]=max(son[x],sz[u]);
    }
    son[x]=max(son[x],sum-sz[x]);
    if(son[x]<son[rt])rt=x;
}
inline void priwork(int x,int last){
    for(int i=head[x];i;i=nxt[i]){
        int u=to[i];
        if(u==last)continue;
        dis[u]=dis[x]+c[i];fa[u]=x;
        priwork(u,x);
    }
}
int Q[N],cnt=0,pre[N],a[N],tot=0,st[N];ll f[N];
inline void bfs(int S){
   int t=0;cnt=0;
    Q[++cnt]=S;pre[S]=fa[S];
    while(t!=cnt){
        int x=Q[++t];
        for(int i=head[x];i;i=nxt[i]){
            if(to[i]==pre[x] || vis[to[i]])continue;
            Q[++cnt]=to[i];pre[to[i]]=x;
        }
    }
    for(int i=1;i<=cnt;i++)pre[Q[i]]=0;
}
inline void dfs(int x,int root){
    if(!x)return ;
   a[++tot]=x;
    if(x==root)return ;
    if(fa[x])dfs(fa[x],root);
}
inline bool comp(int i,int j){
    if(dis[i]!=dis[j])return dis[i]>dis[j];
    return f[i]<f[j];
}
inline bool compdis(int i,int j){
   return dis[i]-lim[i]>dis[j]-lim[j];
}
inline void calc(int x,int root){
    bfs(x);
    tot=0;dfs(fa[x],root);
    sort(a+1,a+tot+1,comp);
    sort(Q+1,Q+cnt+1,compdis);
    int top=0,r=1;
    for(int i=1;i<=cnt;i++){
        int x=Q[i];
        while(r<=tot && dis[x]-lim[x]<=dis[a[r]]){
            while(top>=2 &&
    (f[a[r]]-f[st[top]])/(dis[a[r]]-dis[st[top]])>
    (f[st[top]]-f[st[top-1]])/(dis[st[top]]-dis[st[top-1]]))top--;
            st[++top]=a[r++];
        }
        int L=1,R=top,mid,ret=top,ml,mr;
        while(L<=R){
            mid=(L+R)>>1;
            ml=(L+mid)>>1;mr=(mid+1+R)>>1;
    if(f[st[ml]]-dis[st[ml]]*p[x]<=f[st[mr]]-dis[st[mr]]*p[x])ret=ml,R=mr-1;
            else ret=mr,L=ml+1;
        }
    f[x]=min(f[x],f[st[ret]]+(dis[x]-dis[st[ret]])*p[x]+q[x]);
    }
}
inline void solve(int x,int root){
    vis[x]=1;
    if(fa[x] && !vis[fa[x]])
        rt=0,sum=sz[fa[x]],getroot(fa[x],x),solve(rt,root);
    calc(x,root);
    for(int i=head[x];i;i=nxt[i]){
        if(vis[to[i]] || to[i]==fa[x])continue;
        rt=0;sum=sz[to[i]];getroot(to[i],x);solve(rt,x);
    }
}
void work()
{
    int x;ll y;
    scanf("%d%d",&n,&TT);
    for(int i=2;i<=n;i++){
        scanf("%d%lld%lld%lld%lld",&x,&y,&p[i],&q[i],&lim[i]);
        link(x,i,y);link(i,x,y);
    }
    memset(f,127/3,sizeof(f));f[1]=0;inf=f[0];
    priwork(1,1);getroot(1,1);
    solve(1,1);
    for(int i=2;i<=n;i++)printf("%lld
",f[i]);
}
int main()
{
    freopen("pp.in","r",stdin);
    freopen("pp.out","w",stdout);
    work();
    return 0;
}

bzoj3672[noi2014]购票树分治+斜率优化

【BZOJ3672】[Noi2014]购票Description 今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国n个城市的OIer们都会从各地出发,到SZ市参加这次盛会。    全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲... 查看详情

bzoj3672uoj#7noi2014购票

http://www.lydsy.com/JudgeOnline/problem.php?id=3672http://uoj.ac/problem/7链上的情况可以用斜率优化dp。树上用斜率优化dp时,单调队列的复杂度是均摊$O(n)$的,所以放到树上做“可持久化单调队列”复杂度是$O(n^2)$的,所以不能树上斜率... 查看详情

bzoj3672[noi2014]购票

推一下式子发现就是普通的斜率优化,但是放到了树上,那么我们怎么做呢,树上有什么能保证复杂度的求路径的算法呢,点分治!但是这是有根树,我们对于首先处理点分治后的重心以及与根相连的那个块,之后我们将块中剩... 查看详情

bzoj3672noi2014购票

这题好神啊..好神啊...好神啊...首先列出N2的DP方程较易.从DP方程很容易看出来是斜率优化.如何进一步优化?考虑对当前点以上的链建立一个下凸包.维护凸包就可以,但不是很好写.观察到方程可以必然由它的祖先节点转移.很像Cash... 查看详情

bzoj3672:[noi2014]购票

Description今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国n个城市的OIer们都会从各地出发,到SZ市参加这次盛会。全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的n... 查看详情

bzoj3672/uoj7[noi2014]购票

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。  本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description   ... 查看详情

bzoj3672购票点分治+dp

3672:[Noi2014]购票TimeLimit: 30Sec  MemoryLimit: 512MBSubmit: 1177  Solved: 562[Submit][Status][Discuss]Description 今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国n个城市的OIer们都会从 查看详情

bzoj-3672购票树分治+斜率优化dp

3672:[Noi2014]购票TimeLimit: 30Sec  MemoryLimit: 512MBSubmit: 1177  Solved: 562[Submit][Status][Discuss]Description 今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国n个城市的OIer们都会从 查看详情

bzoj3672:[noi2014]购票(树形dp+斜率优化+可持久化凸包)

  这题的加强版,多了一个$l_i$的限制,少了一个$p_i$的单调性,难了好多...  首先有方程$f(i)=min{f(j)+(dep_i-dep_j)*p_i+q_i}$  $frac{f(j)-f(k)}{dep_j-dep_k}<p_i$  假如没有$l_i$的限制,实际上就是上面那题...  如果多了$l_i$的限... 查看详情

bzoj3672[noi2014]购票斜率优化+cdq分治+树的点分治

题目描述 给出一棵以1为根的带边权有根树,对于每个根节点以外的点$v$,如果它与其某个祖先$a$的距离$d$不超过$l_v$,则可以花费$p_vd+q_v$的代价从$v$到$a$。问从每个点到1花费的最小代价(中途可以经停其它点)输入第1行包... 查看详情

bzoj3672uoj#6noi2014随机数生成器

暴力出奇迹原题:2≤N,M≤50000≤Q≤500000≤a≤3000≤b,c≤1080≤x0<d≤1081≤ui,vi≤N×M 恩首先容易看出来这个棋盘直接模拟搞出来就行了,不用反演矩阵乘之类的奇怪的东西然后又容易发现只需要遍历从1~n*m的数尽量答案里塞就... 查看详情

bzoj3672/luogu2305购票(运用点分治思想的树上cdq分治+斜率优化dp)(代码片段)

我们都做过一道题(?)货币兑换,是用cdq分治来解决不单调的斜率优化现在它放到了树上..总之先写下来dp方程,$f[i]=minf[j]+(dis[i]-dis[j])*p[i]+q[i],j是i的祖先,dis[i]-dis[j]<=l[i]$,其中dis[i]表示1号点到i号点的距离可以很明显的看出... 查看详情

noi2014购票

传送门另一个传送门这题劲啊……其实这题题解应该都烂大街了,不过我还是想大概写一下……就当是留作以后复习用也好……$t=0$的斜率优化很好搞。到了$t=1$的情况时,每个点都有转移区间的限制,做法大致就有线段树维护... 查看详情

[noi2014]购票---斜率优化+树形dp+数据结构(代码片段)

题目描述今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国n个城市的OIer们都会从各地出发,到SZ市参加这次盛会。全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的n... 查看详情

bzoj3669:[noi2014]魔法森林

地址:题目:3669:[Noi2014]魔法森林TimeLimit: 30Sec  MemoryLimit: 512MBSubmit: 2955  Solved: 1851[Submit][Status][Discuss]Description为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林 查看详情

[bzoj3670][noi2014]动物园

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3670[Noi2014]动物园TimeLimit: 10Sec  MemoryLimit: 512MBSubmit: 2644  Solved: 1425[Submit][Status][Discuss]Descr 查看详情

bzoj3669[noi2014]魔法森林

[Noi2014]魔法森林TimeLimit: 30Sec  MemoryLimit: 512MBSubmit: 3078  Solved: 1944[Submit][Status][Discuss]Description为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含... 查看详情

bzoj3670[noi2014]动物园

3670:[Noi2014]动物园TimeLimit: 10Sec  MemoryLimit: 512MBSubmit: 2032  Solved: 1077[Submit][Status][Discuss]Description近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动 查看详情