bzoj 3156: 防御准备

3156: 防御准备

Time Limit: 10 Sec  Memory Limit: 512 MB
[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

18

HINT

1<=N<=10^6,1<=Ai<=10^9

枚举上一个守卫塔建在哪儿转移DP

斜率优化

#include<cstdio>
#include<iostream>
#define N 1000001
using namespace std;
long long sum[N],dp[N];
int a[N];
int head,tail,q[N];
void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c))  c=getchar();
    while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); }
}
long long up(int k,int j)
{
    return dp[j]-dp[k]+sum[j]-sum[k];
}
long long down(int k,int j)
{
    return j-k;
}
int main()
{
    int n;
    read(n);
    for(int i=1;i<=n;i++) read(a[i]),sum[i]=sum[i-1]+i;
    int j;
    for(int i=1;i<=n;i++)
    {
        while(head<tail && up(q[head],q[head+1])<=down(q[head],q[head+1])*i) head++;
        j=q[head];
        dp[i]=dp[j]+1ll*i*(i-j)-sum[i]+sum[j]+a[i];
        while(head<tail && up(q[tail-1],q[tail])*down(q[tail],i)>=up(q[tail],i)*down(q[tail-1],q[tail])) tail--;
        q[++tail]=i;
    }
    printf("%lld",dp[n]);
}
时间: 2024-10-13 16:13:09

bzoj 3156: 防御准备的相关文章

斜率优化专题3——bzoj 3156 防御准备 题解

[原题] 3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 198  Solved: 107 [Submit][Status] Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT

BZOJ 3156: 防御准备 斜率优化DP

3156: 防御准备 Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<=N<=10^6,1<=Ai<=10^9 题解: 斜率优化DP: 首先将数组倒置 设定dp[i] 为前i的点的最优答案 易得 dp[i] = min{dp[j

bzoj 3156 防御准备(斜率DP)

3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 837  Solved: 395[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 18 HIN

【bzoj 3156】防御准备

Description Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 10 2 3 1 5 4 5 6 3 1 2 Sample Output 18 HINT 1<=N<=10^6,1<=Ai<=10^9 long long!long long!long long! 又是一发惨剧现场-- 1 #include<cstdio> 2

bzoj 3156

f[i]=max{f[j]+(i-j-1)*i-(b[i-1]-b[j])+a[i]}b[i]为i的前缀和 易得(f[j]+b[j]-f[k]-b[k])/(j-k)<i 同样单调队列维护凸包 longlong老是没注意,AC率就是这么刷下来的QAQ 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4

2016.6.10 考试总结

汽艇(Boat.cpp/c/pas) [问题描述] 有 n 个人要去坐 1 汽艇,每个人单独坐汽艇的快乐程度是 Ci,每多一个人,他的快乐程度会减去 Di,请求出使快乐程度之和达到最大的方案.(假设汽艇的容量足够大). [输入格式] 输入文件共有 3 行: 第1 行是一个整数 n: 第2 行有n 个整数,依次表示每个人单独坐汽艇的快乐程度 Ci(1<=Ci<=10000): 第3 行有n 个整数,依次表示每多 1 人,每个人快乐程度的下降值 Di(1<=Di<=10). [输出格式

【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

bzoj3156防御准备

3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1349  Solved: 605[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 18 HI

bzoj3156 防御准备

3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 981  Solved: 462 [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 18 H