博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ1911】[Apio2010]特别行动队 斜率优化DP
阅读量:4654 次
发布时间:2019-06-09

本文共 1336 字,大约阅读时间需要 4 分钟。

  想了好久啊.。。。——黑字为第一次更新。——这里是第二次更新,维护上下凸包据题而论,第一种方法是化式子的方法,需要好的化式子的方法,第二种是偏向几何,十分好想,纯正的维护凸包的方法,推荐。

  用了我感觉比较好写的一种(因为没写过维护凸包),另一种是维护(上)凸包的做法,本质一样?推荐

  网上的大多数解法:

  DP:f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b(sum[i]-sum[j])+c)

  显然复杂度不对。

  那么假设j>k且f[j]优于f[k]

  f[j]-f[k]+a*(sum[j]^2-sum[k]^2)-b*(sum[j]-sum[k])>2*a*(sum[x]-sum[y])*sum[i] (过程省略,把已知的sum[i]放在一边,剩下的放在一边)

  其实不太明白这个式子求的是啥,但是可以感受到其中的单调之力(用里面的单调函数应该能科学的证明),我理解为“优度”,优度>sum[i]时就是表示j>k且f[j]优于f[k]的时候,也就是用单调队列维护这个“优度”。(以上为强行YY出的解释

  于是就这样了。。。注意:a<0,除过来要变号(mdzz

  

1 #include 
2 #include
3 #define N 1000000+100 4 #define ll long long 5 using namespace std; 6 ll sum[N],f[N]; 7 int l,r,n,a,b,c,x; 8 int q[N]; 9 inline int read()10 {11 int ans=0,f=1;12 char c;13 while (!isdigit(c=getchar())) if (c=='-') f=-1;14 ans=c-'0';15 while (isdigit(c=getchar())) ans=ans*10+c-'0';16 return ans*f;17 }18 inline ll Pow(ll x) {
return x*x;}19 inline double Getk(int x,int y) {
return (double)(f[x]-f[y]+a*(Pow(sum[x])-Pow(sum[y]))-b*(sum[x]-sum[y]))/(double)(2*a*(sum[x]-sum[y]));}20 int main()21 {22 n=read();23 a=read(); b=read(); c=read();24 for (int i=1;i<=n;i++) x=read(),sum[i]=sum[i-1]+x;25 for (int i=1;i<=n;i++)26 {27 while (l
View Code

 

转载于:https://www.cnblogs.com/DMoon/p/5424953.html

你可能感兴趣的文章
多线程(二)--NSThread基本使用
查看>>
git command
查看>>
使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍
查看>>
html里 调整字间距
查看>>
RabbitMQ的Vhost,Exchange,Queue原理分析
查看>>
Mac上编写C语言程序
查看>>
251.Flatten 2D Vector
查看>>
WLS Exception: Need to specify class name in environment or system property Solution
查看>>
人见人爱A^B
查看>>
消除头文件
查看>>
Android中数据文件解析(Json解析)
查看>>
自定义seekBar设置进度条背景图片
查看>>
java容器类1:Collection,List,ArrayList,LinkedList深入解读
查看>>
16日彻底去除安卓应用的内置广告
查看>>
再谈.NET Micro Framework移植
查看>>
ssm资源配置
查看>>
斗鱼爬虫,爬取颜值频道的主播图片和名字
查看>>
【Codeforces Round #439 (Div. 2) B】The Eternal Immortality
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 B】 Lazy Security Guard
查看>>
【codeforces 499C】Crazy Town
查看>>