题目描述

给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n+1)$ 的路径,使得经过的点(包括起点和终点)权值和最小。求这个权值和。

输入

第一行一个正整数 $n$ 。

第二行 $n+1$ 个正整数 $a[0],a[1],…,a[n]$ ,表示从内到外每层的中继器的延时值。

输出

输出一行一个数表示改造后的最短引爆时间。

样例输入

9
9 5 3 7 6 9 1 8 2 4

输出

69


题解

CDQ分治+斜率优化dp

我tm就是个傻逼 = =  明明正解就一个贪心我非要写dp+斜率优化。。。

显然所选路径具有对称性,并且是从左上角走到 $(i,i),i\le n+1$ ,然后沿着这个等距离圈走到 $(2n+2-i,2n+2-i)$ ,再按照同样的路径返回。

设 $f[i]$ 表示到点 $(i+1,i+1)$ 的最小代价。

设 $b[i]=a[n-1-i]$ (为了方便从外层向内层递推)

正解:从 $i$ 到 $i+1$ 显然是通过 $1\sim i$ 中最小的那一层向右平移的,因此 $f[i]=f[i-1]+b[i]+\text{max}_{j=0}^{i-1}b[j]$ ,边界条件 $f[0][0]=b[0]$。

   时间复杂度 $O(n)$

我的解法:考虑从 $(j,j)$ 先横着走到 $(j,i)$ 再走到 $(i,i)$ 的过程,那么有:$f[i]=\text{max}_{j=0}^{i-1}(f[j]+\sum\limits_{k=j+1}^ib[k]+(i-j)·b[i])$.

     前缀相减得 $f[i]=f[j]+sum[i]-sum[j]+(i-j)·b[j]$ 。

     移项得 $j·b[j]+sum[j]-f[j]=i·b[j]+sum[i]-f[i]$ 。

     容易发现可以斜率优化,要求截距得最大值,维护上凸壳。

     但是这里的横坐标 $b[j]$ 不单调,因此无法使用单调数据结构维护,因此使用CDQ分治。

     时间复杂度 $O(n\log n)$

不管了反正过去了。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
typedef long long ll;
ll a[N] , sum[N] , f[N];
int id[N] , t[N] , sta[N];
inline ll y(int i) {return a[i] * i + sum[i] - f[i];}
inline ll x(int i) {return a[i];}
inline long double slop(int a , int b) {return (long double)(y(b) - y(a)) / (x(b) - x(a));}
void solve(int l , int r)
{
if(l == r)
{
id[l] = l;
return;
}
int mid = (l + r) >> 1 , i , j , k;
solve(l , mid);
for(k = 0 , i = l ; i <= mid ; i ++ )
{
while(k && x(sta[k]) == x(id[i])) k -- ;
while(k > 1 && slop(sta[k] , id[i]) <= slop(sta[k - 1] , sta[k])) k -- ;
sta[++k] = id[i];
}
for(j = 1 , i = mid + 1 ; i <= r ; i ++ )
{
while(j < k && slop(sta[j] , sta[j + 1]) >= i) j ++ ;
f[i] = min(f[i] , f[sta[j]] + a[sta[j]] * (i - sta[j]) + sum[i] - sum[sta[j]]);
}
solve(mid + 1 , r);
for(i = j = l , k = mid + 1 ; i <= r ; i ++ )
{
if(k > r || (j <= mid && (x(id[j]) == x(id[k]) ? y(id[j]) < y(id[k]) : x(id[j]) < x(id[k])))) t[i] = id[j ++ ];
else t[i] = id[k ++ ];
}
for(i = l ; i <= r ; i ++ ) id[i] = t[i];
}
int main()
{
int n , i;
ll ans = 1ll << 62;
scanf("%d" , &n);
for(i = n ; ~i ; i -- ) scanf("%lld" , &a[i]) , sum[i] = a[i];
for(i = 1 ; i <= n ; i ++ ) sum[i] += sum[i - 1];
memset(f , 0x3f , sizeof(f));
f[0] = a[0] , solve(0 , n);
for(i = 0 ; i <= n ; i ++ )
ans = min(ans , 2 * f[i] + (4 * (n - i) - 1) * a[i]);
printf("%lld\n" , ans);
return 0;
}

【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp的更多相关文章

  1. BZOJ1492:[NOI2007]货币兑换 (CDQ分治+斜率优化DP | splay动态维护凸包)

    BZOJ1492:[NOI2007]货币兑换 题目传送门 [问题描述] 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和B纪念券(以下简称B券).每个持有金券的 ...

  2. BZOJ 3963: [WF2011]MachineWorks [CDQ分治 斜率优化DP]

    传送门 当然了WF的题uva hdu上也有 你的公司获得了一个厂房N天的使用权和一笔启动资金,你打算在这N天里租借机器进行生产来获得收益.可以租借的机器有M台.每台机器有四个参数D,P,R,G.你可以 ...

  3. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...

  4. bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5541  Solved: 2228[Submit][Sta ...

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

    我们都做过一道题(?)货币兑换,是用cdq分治来解决不单调的斜率优化 现在它放到了树上.. 总之先写下来dp方程,$f[i]=min\{f[j]+(dis[i]-dis[j])*p[i]+q[i]\} ...

  6. BZOJ 3963 HDU3842 [WF2011]MachineWorks cdq分治 斜率优化 dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3842 写的check函数里写的<但是应该是<=,调了一下午,我是个zz. 就是普通的斜率优化因为有两 ...

  7. bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp

    3963: [WF2011]MachineWorks Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 270  Solved: 80[Submit][S ...

  8. [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化)

    [BZOJ1492] [NOI2007] 货币兑换Cash(cdq分治+斜率优化) 题面 分析 dp方程推导 显然,必然存在一种最优的买卖方案满足:每次买进操作使用完所有的人民币:每次卖出操作卖出所有 ...

  9. BZOJ4700 适者(贪心+cdq分治+斜率优化)

    首先考虑怎么安排攻击顺序.显然如果攻击了某台兵器就应该一直连续攻击直到将其破坏,破坏所需时间可以直接算出来,设其为b.假设确定了某个破坏顺序,如果交换相邻两个兵器,显然不会对其他兵器造成影响,两种顺序 ...

随机推荐

  1. 20155327李百乾 Exp3 免杀原理与实践

    20155327李百乾 Exp3 免杀原理与实践 实践guocheng 一.Msfvenom使用编码器 1.利用(virustota)[https://www.virustotal.com/]检测实验 ...

  2. plsql高级查询命令

    一.DDL数据定义语言:表操作 1.新建表 SQL> create table good(id number,name varchar2(10)); 添加注释 SQL> comment o ...

  3. maven 发布springboot项目

    1.把Spring Boot打包成JAR的形式,需要在pom.xml文件对应以下代码 <build> <finalName>ljl</finalName> //打包 ...

  4. 让div跟着鼠标移动

    朋友求助帖 具体实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  5. C#:通过NuGet程序包下载CefSharp来加载谷歌浏览器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 首先我讲明一下我要做的,公司有个C# wpf的项目需要我把一个开发好的网页嵌入到客户端当中,由于种种原因,我放 ...

  6. Oracle用户和模式,表空间

    oracle 用户与表空间关系 oracle用户与表空间关系用户=商家表=商品表空间=仓库1. 1个商家能有很多商品,1个商品只能属于一个商家2. 1个商品可以放到仓库A,也可以放到仓库B,但不能同时 ...

  7. [flex 布局]——flex教程

    简介:2009年,W3C提出了一种新的方案----Flex布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能. Flex布局是什 ...

  8. axios封装(二)队列管理

    在某些特定的场景(比如 即时搜索 ,表格分页),会频繁的发起ajax请求,而由于ajax是异步API,所以返回的时序并不能够保证,这时候就需要实现一个ajax队列,在相同的请求发起时,取消处理上一个请 ...

  9. 剑指offer-数值的整数方

    数值的整数方 一.问题描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 二.算法思路 按照指数Exp的情况进行讨论. Exp> ...

  10. hbase中balance机制

    HBase是一种支持自动负载均衡的分布式KV数据库,在开启balance的开关(balance_switch)后,HBase的HMaster进程会自动根据指定策略挑选出一些Region,并将这些Reg ...