【BZOJ】【3156】防御准备
DP/斜率优化
斜率优化的裸题……
sigh……又把$10^6$当成10W了……RE了N发
这题还是很水的
当然逆序也能做……不过还是整个反过来比较顺手
反转后的a[0]=反转前的a[n],以此类推直到a[n-1],反转后的a[n]=0;
令f[0]=a[0],因为最初状态必须选第一个守卫塔。
然后定义f[i]表示在第 i 个位置放守卫塔,0~i 的代价最小值
易得$f[i]=min\{ f[j]+\frac{(i-j)*(i-j-1)}{2}+a[i] \} $
单调性证明:$( j > k ) $
\[ \begin{aligned} f[j]-f[k]+\frac{(i-j)*(i-j-1)}{2}-\frac{ (i-k)*(i-k-1)}{2} &< 0 \\ f[j]-f[k]+\frac{j^2+j-k^2-k}{2} &< i*(j-k) \\ \frac{f[j]-f[k]+\frac{j^2+j-k^2-k}{2}}{j-k} &< i \end{aligned} \]
/**************************************************************
Problem: 3156
User: Tunix
Language: C++
Result: Accepted
Time:2476 ms
Memory:24708 kb
****************************************************************/ //BZOJ 3156
#include<cstdio>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=;
typedef long long LL;
/******************tamplate*********************/
LL n,q[N],l,r;
LL a[N],f[N];
inline double slop(LL k,LL j){
return double(f[j]-f[k]+(j*j+j-k*k-k)/2.0)/double(j-k);
}
int main(){
n=getint();
D(i,n-,) a[i]=getint();
f[]=a[];
F(i,,n){
while(l<r && slop(q[l],q[l+])<i)l++;
int t=q[l];
f[i]=f[t]+(LL)(i-t)*(i-t-)/+a[i];
while(l<r && slop(q[r-],q[r])>slop(q[r],i)) r--;
q[++r]=i;
}
printf("%lld\n",f[n]);
return ;
}
3156: 防御准备
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 618 Solved: 296
[Submit][Status][Discuss]
Description

Input
第一行为一个整数N表示战线的总长度。
第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai。
Output
共一个整数,表示最小的战线花费值。
Sample Input
10
2 3 1 5 4 5 6 3 1 2
Sample Output
HINT
1<=N<=10^6,1<=Ai<=10^9
Source
【BZOJ】【3156】防御准备的更多相关文章
- BZOJ 3156: 防御准备 斜率优化DP
3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战 ...
- bzoj 3156 防御准备(斜率DP)
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 837 Solved: 395[Submit][Status][Discuss] ...
- BZOJ 3156: 防御准备( dp + 斜率优化 )
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...
- BZOJ 3156 防御准备
也是斜率优化....推下式子就好了. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- bzoj 3156: 防御准备【斜率优化dp】
就是套路咯,设s[i]为1+2+...i 首先列出dp方程\( f[i]=min(f[j]+a[i]+(i-j)*i-(s[i]-s[j])) \) 然后推一推 \[ f[i]=f[j]+a[i]+( ...
- 【BZOJ 3156】防御准备
[链接] 链接 [题意] 在这里输入题意 [题解] 把a倒过来 设f[i]表示在i放一个防御塔的最小花费; 我们如果从j转移过来 就表示j+1..i-1这一段放人偶. s[i] = 1 + 2 + . ...
- DP的优化总结
一.预备知识 \(tD/eD\) 问题:状态 t 维,决策 e 维.时间复杂度\(O(n^{e+t})\). 四边形不等式: 称代价函数 w 满足凸四边形不等式,当:\(w(a,c)+w(b,d)\l ...
- 【BZOJ-3156】防御准备 DP + 斜率优化
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 951 Solved: 446[Submit][Status][Discuss] ...
- BZOJ3156: 防御准备
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 442 Solved: 210[Submit][Status] Descript ...
随机推荐
- [leetcode]_Pascal's Triangle II
题目:Pascal三角的变形,要求只用O(K)的额外空间. 思路:由于Pascal三角中,tri[n][i] = tri[n - 1][i] + tri[n-1][i-1],(通常情况下) 如果已经获 ...
- 关于ASP.net TextBox控件的失去焦点后触发其它事件
编写人:CC阿爸 2015-2-02 今天在这里,我想与大家一起分享如何处理的ASP.net TextBox控件的失去焦点后触发其它事件的问题,在此做个小结,以供参考.有兴趣的同学,可以一同探讨与学习 ...
- 在oracle中通过链接服务器(dblink)访问sql server
在oracle中通过链接服务器(dblink)访问sql server 2013-10-16 一. 工作环境: <1> Oracle数据库版本:Oracle 11g 运行环境 :IB ...
- android 分段显示文本颜色控件
效果: 使用: <com.bei.myapplication.app.ProgressTextView xmlns:ptv="http://schemas.android.com/ap ...
- 【php学习之路】php基础语法
一.什么是php? PHP即PHP: Hypertext Preprocessor(超文本处理器),是一种服务器端脚本语言,适用于创建web站点.开源免费 二.php能做什么? ...
- QQl聊天消息
Activity: package com.zzw.qqchat; import java.util.ArrayList; import java.util.HashMap; import andro ...
- android中常用菜单(menu)的基本知识
(一)选项菜单 1.简单的创建菜单: @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMe ...
- mssql 置疑的处理
declare @dbName sysName ALTER DATABASE @dbName SET EMERGENCY ALTER DATABASE @dbName SET SINGLE_USER ...
- DevExpress 关于 GridView 表格编辑中 点击其他按钮里导致 值未取到处理
只需要给添加以下代码 在执行其他按钮前调 用一下 就可以了:主要是用来关闭编辑以及更新当前行编辑内容 this.gridControl1.FocusedView.CloseEditor(); this ...
- SQLite中命令行程序(CLP)的使用
SQLite CLP是使用和管理SQLite数据库最常用的工具.它在所有平台上的操作方式相同.CLP其实是两个程序,它可以运行在Shell模式下以交互的方式执行查询操作,也可以运行在命令行模式下完成各 ...