正题


题目大意

定义函数f(x)=Ax3+Bx2+Cx+Df(x)=Ax^3+Bx^2+Cx+Df(x)=Ax3+Bx2+Cx+D
然后给出一个序列,要求按顺序分成若干段。对于一段[L..R][L..R][L..R],贡献为f(min{ai}(i∈[L..R]))f(min\{a_i\}(i\in[L..R]))f(min{ai​}(i∈[L..R]))
然后要求所有段的贡献之和最大。


解题思路

我们考虑dpdpdp,设gig_igi​表示将1∼i1\sim i1∼i分成若干段时的贡献,那么我们有gi=gj+wj+1,i(j&lt;i)g_i=g_j+w_{j+1,i}(j&lt; i)gi​=gj​+wj+1,i​(j<i)
(wl,rw_{l,r}wl,r​表示l∼rl\sim rl∼r这段范围的贡献)

但是时间复杂度为O(n2)O(n^2)O(n2),显然不能胜任本题。

然后我们需要考虑用数据结构优化,我们发现对于每个aia_iai​,但计算到gig_igi​或以后时,它能影响的一定是k∼ik\sim ik∼i这段范围。那我们对于每个aia_iai​,我们都计算出这个范围,我们发现这个范围其实就是在它前面的比它大的且与它最近的一个数,这个我们可以用双端链表O(nlogn)O(n\ log\ n)O(n log n)进行计算。

然后我们枚举kkk,然后用线段树维护gi+f(min{aj}(j∈[i..k]))g_{i}+f(min\{a_{j}\}(j\in[i..k]))gi​+f(min{aj​}(j∈[i..k]))的最大值即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+100,inf=1e18;
struct Tree_node{ll w,lazy;
};
struct Seq_node{Tree_node t[N*4]; void Build(ll x,ll l,ll r){t[x].lazy=-inf;if(l==r){t[x].w=-inf;return;}ll mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);t[x].w=max(t[x*2].w,t[x*2+1].w);}void downdata(ll x){if(t[x].lazy==-inf) return;t[x*2].w=t[x*2+1].w=t[x*2].lazy=t[x*2+1].lazy=t[x].lazy; t[x].lazy=-inf;}void Change(ll x,ll l,ll r,ll w,ll L,ll R){if(l==L&&r==R){t[x].w=w;t[x].lazy=w;return;}downdata(x);ll mid=(L+R)/2;if(r<=mid) Change(x*2,l,r,w,L,mid);else if(l>mid) Change(x*2+1,l,r,w,mid+1,R);else Change(x*2,l,mid,w,L,mid),Change(x*2+1,mid+1,r,w,mid+1,R);t[x].w=max(t[x*2].w,t[x*2+1].w);}ll Ask(ll x,ll l,ll r,ll L,ll R){if(l==L&&r==R)return t[x].w;downdata(x);ll mid=(L+R)/2;if(r<=mid) return Ask(x*2,l,r,L,mid);if(l>mid) return Ask(x*2+1,l,r,mid+1,R);return max(Ask(x*2,l,mid,L,mid),Ask(x*2+1,mid+1,r,mid+1,R));}
}T,T2;
ll n,A,B,C,D,prev[N],next[N],id[N],last[N],f[N],ans,a[N];
bool cMp(ll x,ll y)
{return a[x]>a[y];}
ll Val(ll x)
{return A*x*x*x+B*x*x+C*x+D;}
int main()
{//freopen("min.in","r",stdin);//freopen("min.out","w",stdout);scanf("%lld%lld%lld%lld%lld",&n,&A,&B,&C,&D);for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);id[i]=i;}for(ll i=1;i<=n;i++)prev[i]=i-1,next[i]=i+1;sort(id+1,id+1+n,cMp);for(ll i=1;i<=n;i++){ll x=id[i];last[x]=prev[x];prev[next[x]]=prev[x];next[prev[x]]=next[x];}T.Build(1,0,n);T2.Build(1,0,n);T.Change(1,0,0,0,0,n);T2.Change(1,0,0,0,0,n);for(ll i=1;i<=n;i++){ll val=T2.Ask(1,last[i],i,0,n);T.Change(1,last[i],i,val+Val(a[i]),0,n);ans=T.t[1].w;T2.Change(1,i,i,ans,0,n);}printf("%lld",ans);
}

jzoj6305-最小值【线段树,dp,双端链表】相关推荐

  1. java双链表基本方法_Java数据结构之双端链表原理与实现方法

    本文实例讲述了Java数据结构之双端链表原理与实现方法.分享给大家供大家参考,具体如下: 一.概述: 1.什么时双端链表: 链表中保持这对最后一个连点引用的链表 2.从头部插入 要对链表进行判断,如果 ...

  2. 设某链表中最常用的操作是在链表的尾部_Redis系列(二)底层数据结构之双端链表...

    前言 定义 优劣 双向链表 无环链表 带有头指针和尾指针 带有长度计数器 总结 参考文章 联系我 前言 Redis 已经是大家耳熟能详的东西了,日常工作也都在使用,面试中也是高频的会涉及到,那么我们对 ...

  3. Java单链表、双端链表、有序链表实现

    Java单链表.双端链表.有序链表实现 原创 2014年03月31日 23:45:35 标签: Java / 单链表 / 双端链表 / 有序链表 65040 单链表: insertFirst:在表头插 ...

  4. UESTC 1593 老司机破阵 优先队列+双端链表

    老司机破阵 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  St ...

  5. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  6. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. CodeForces - 487B Strip(线段树+dp+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...

  8. POJ1769(线段树+DP)

    飞翔 题意 : 给定一个区间长度 n ,接下来给出 m 个子区间,要求最少选出多少个区间才能使得 1~n 这个区间被所选的所有子区间覆盖 分析: 首先是动态规划,dp[i]表示把最大值从1位置搞到第i ...

  9. C2 - Pokémon Army (hard version)(思维+差分/线段树+dp)详解

    https://codeforces.com/contest/1420/problem/C2 这道题十分的锻炼思维,也让我知道了同样是差分,从前面减后面和从后面减前面是有不同的意义的. 还记得c1吗? ...

最新文章

  1. 深度学习领域四个不可不知的重大突破
  2. Boost::split用法详解
  3. 网页制作获得用户喜爱才是重点!
  4. Class,表名,表单参数名关系
  5. 贴一个CMemDC 代码,这东西真不错噢,短小精悍,可谓极品
  6. 【PTA天梯赛CCCC -2017决赛L2-4】部落 (25 分)(图染色)
  7. 怎么时装linux可用空间变大,[合集]OpenSUSE安装octave时装1G多texliv - 精华区 - 优秀的Free OS(Linux)版 - 北大未名BBS...
  8. 再现暴力裁员!患病员工被关小黑屋,摄像头监控,工作量超其他人!
  9. HTML5 css链接添加不同的样式
  10. 别瞎写工具类了,Spring自带的这些他不香麽?
  11. 实现不规则形状的按钮
  12. Cron定时任务应用到Thinkphp – 贤生博客
  13. python做bi系统_如何用开源bi,打造自己的轻量级bi系统
  14. Java jdk的下载与安装
  15. 谷歌浏览器http请求之curl使用
  16. IoC容器和 Dependency Injection模式 Inversion of Control Containers and the Dependency Injection pattern
  17. 表白套路计算机公式,高级表白密码我喜欢你公式 套路喜欢的人
  18. nginx 504错误日志出现 upstream timed out (110: Connection timed out) while reading response
  19. javascript学习笔记下篇--浏览器对象
  20. TokenInsight 对话首席——市场回暖,挖矿or买币?(完整稿)

热门文章

  1. java iter是否存在_Java中ListIterator和Iterator的区别以及ListIterator的应用
  2. 计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算
  3. php上传文件很慢的原因_PHP编码安全:上传文件安全
  4. 模拟器显示空白图片_Kawaks街机模拟器,还是小时候的味道!
  5. css less 不要作用到子对象_使用Less实现网站主题切换
  6. java 云架构_java版Spring Cloud云架构代码结构构建
  7. leetcode47. 全排列 II
  8. 7-44 基于词频的文件相似度 (30 分)(思路加详解+set容器简便做法)兄弟们冲呀呀呀呀呀 今天你AC了吗
  9. [C++STL]常用查找算法
  10. [C++STL]C++ 实现map容器和set容器