3437: 小P的牧场
来源:互联网 发布:学电脑编程 编辑:程序博客网 时间:2024/04/30 00:31
题目链接
题目大意:有些按照一字排列的牧场,每一个牧场有一个费用和放牧数量。现在要在一些牧场上建造控制站,目的是控制所有的牧场,建立控制站的基础费用就是每个牧场的费用,然后每一个牧场需要付这个牧场的放养数量*它与右边相邻的控制站的距离。求最小的费用
题解:把题目求的东西差分一下
我的收获:大法吼啊
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define M 1000005int deq[M],a[M],n;long long sum[M],sum2[M],dp[M];inline long long up(int x,int y){return dp[y]-dp[x]+sum2[y]-sum2[x];}inline long long down(int x,int y){return sum[y]-sum[x];}inline long long calc(int x,int y){return dp[x]+a[y]+(sum[y]-sum[x])*y-(sum2[y]-sum2[x]);}void work(){ int l=1,r=0;deq[++r]=0; for(int i=1;i<=n;i++){ while(l<r&&up(deq[l],deq[l+1])<=i*down(deq[l],deq[l+1])) l++; dp[i]=calc(deq[l],i); while(l<r&&up(deq[r-1],deq[r])*down(deq[r],i)>up(deq[r],i)*down(deq[r-1],deq[r])) r--; deq[++r]=i; } printf("%lld\n",dp[n]);}void init(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1,x;i<=n;i++) scanf("%d",&x),sum[i]=sum[i-1]+x,sum2[i]=sum2[i-1]+1LL*x*i; }int main(){ init(); work(); return 0;}
阅读全文
0 0
- 3437: 小P的牧场
- 3437: 小P的牧场
- 3437: 小P的牧场
- bzoj 3437: 小P的牧场
- 【DP】 BZOJ 3437: 小P的牧场
- BZOJ 3437 小P的牧场
- bzoj 3437: 小P的牧场
- bzoj 3437: 小P的牧场
- 【bzoj 3437】小P的牧场
- BZOJ 3437: 小P的牧场
- [BZOJ3437]小P的牧场
- [BZOJ3437] 小P的牧场
- bzoj3437 小P的牧场
- BZOJ3437 小P的牧场
- bzoj3437 小P的牧场
- [bzoj3437] 小P的牧场
- BZOJ3437: 小P的牧场
- BZOJ3437: 小P的牧场
- Java8 常用的Stream流操作
- 实战演练 text15 T1
- HDU2159FATE
- vb.net创建和调用DLL教程
- 【洛谷2017】 【USACO09DEC】晕牛Dizzy Cows
- 3437: 小P的牧场
- 先验概率,似然估计和后验概率
- 3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助
- composer使用
- kangbin 数论基础 R
- 阿里云虚拟主机的使用,附幸运券领取
- C#调用matlab函数详细步骤和例程
- opencv-python 学习笔记1:简单的图片处理
- 【linux go语言安装】阿里云下go语言如何安装?