bgm(雾)

luogu

首先是那个区间的价值比较奇怪,如果推导后可以发现只有左右端点元素都是同一种\(s_x\)的区间才有可能贡献答案,并且价值为\(s_x(cnt(x)_r-cnt(x)_{l-1})^2\),这是因为如果选出来的这种元素的端点的左右两边还有其他元素,那么显然的把那些其他的元素另外划分在别的区间里可以获得更优的答案

然后现在就可以\(O(n^2)\)了,转移大概为\(f_i=\min_{j<i,s_j=s_i} f_{j-1}+s_i(cnt(s_i)_i-cnt(s_i)_{j-1})^2\).考虑固定\(j\),随着\(i\)的右移,\(j\)位置的贡献是要比一个\(>j\)的\(k\)位置的贡献减少速度更快的,如果在某个位置\(j\)比\(k\)更优,那么以后\(k\)都不会更优了.所以考虑用单调栈维护这些决策点,在转移的时候如果栈顶下面的元素比栈顶元素更优了就弹栈顶,这个判断一个元素比另一个更优的时刻可以看做是维护凸壳,然后求一下直线交点.转移时用栈顶转移,接着把这个位置的dp值插入单调栈

不过这样做可能会出现栈顶下面两个元素比栈顶元素更优的时刻 要比 栈顶下面一个元素比栈顶元素更优的时刻 要早的情况,可以发现这种情况下栈顶下面一个元素就一定不优了,所以在插入元素的时候弹掉不优的就好了

#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double using namespace std;
const int N=1e5+10,M=1e4+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct line
{
db k,b;
}li[N];
db crs(line aa,line bb){return (bb.b-aa.b)/(aa.k-bb.k);}
int n,a[N],nt[N],bk[M],s[N];
LL f[N];
vector<int> stk[M];
vector<int>::iterator it; int main()
{
n=rd();
for(int i=1;i<=n;++i) a[i]=rd();
li[0].k=li[0].b=0;
stk[a[1]].push_back(0);
for(int i=1;i<=n;++i)
nt[i]=bk[a[i]],s[i]=s[nt[i]]+1,bk[a[i]]=i;
for(int i=1;i<=n;++i)
{
int x=a[i],nn=stk[x].size();
while(nn>1&&crs(li[stk[x][nn-1]],li[stk[x][nn-2]])<=(db)s[i]) --nn,stk[x].pop_back();
it=--stk[a[i]].end();
f[i]=(LL)li[*it].k*s[i]+(LL)li[*it].b+1ll*a[i]*s[i]*s[i];
li[i].k=-2ll*a[i+1]*s[nt[i+1]],li[i].b=f[i]+1ll*a[i+1]*s[nt[i+1]]*s[nt[i+1]];
x=a[i+1],nn=stk[x].size();
while(nn>1&&crs(li[stk[x][nn-2]],li[i])<=crs(li[stk[x][nn-1]],li[i])) --nn,stk[x].pop_back();
stk[x].push_back(i);
}
printf("%lld\n",f[n]);
return 0;
}

luogu P5504 [JSOI2011]柠檬的更多相关文章

  1. P5504 [JSOI2011]柠檬

    传送门 显然考虑 $dp$ ,发现从右往左和从左往右是一样的,所以只考虑一边就行 发现对于切的左右端点,选择的 $s0$ 一定要为左右端点的贝壳大小,不然这个端点不产生贡献还不如分开来单个贡献 所以设 ...

  2. bzoj4709: [Jsoi2011]柠檬 斜率优化

    题目链接 bzoj4709: [Jsoi2011]柠檬 题解 斜率优化 设 \(f[i]\) 表示前 \(i\)个数分成若干段的最大总价值. 对于分成的每一段,左端点的数.右端点的数.选择的数一定是相 ...

  3. 4709: [Jsoi2011]柠檬

    4709: [Jsoi2011]柠檬 https://www.lydsy.com/JudgeOnline/problem.php?id=4709 分析: 决策单调性+栈+二分. 首先挖掘性质:每个段选 ...

  4. 【BZOJ】4709: [Jsoi2011]柠檬

    4709: [Jsoi2011]柠檬 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 779  Solved: 310[Submit][Status][ ...

  5. 【BZOJ4709】[Jsoi2011]柠檬 斜率优化+单调栈

    [BZOJ4709][Jsoi2011]柠檬 Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,0 ...

  6. 【LG5504】[JSOI2011]柠檬

    [LG5504][JSOI2011]柠檬 题面 洛谷 题解 考虑\(dp\),令\(f_i\)表示\(dp\)到第\(i\)位且在第\(i\)位分段的最大值. 我们令题面中的\(s_i\)为\(a_i ...

  7. 笔记-[JSOI2011]柠檬

    笔记-[JSOI2011]柠檬 [JSOI2011]柠檬 \(f_i\) 表示到第 \(i\) 只贝壳最多可以换得的柠檬数. 令 \(c_i=\sum_{h=1}^i[s_h=s_i]\). \[\b ...

  8. bzoj4709 [jsoi2011]柠檬

    Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N  ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们 ...

  9. 【bzoj4709】[Jsoi2011]柠檬 斜率优化

    题目描述 给你一个长度为 $n$ 的序列,将其分成若干段,每段选择一个数,获得 $这个数\times 它在这段出现次数的平方$ 的价值.求最大总价值. $n\le 10^5$ . 输入 第 1 行:一 ...

随机推荐

  1. tp5更改入口文件到根目录的方法分享

    tp5把入口文件放到了public目录中,对于服务器或者vps来说没啥,因为可以指定目录,但是对于虚拟主机就不行了,我们必须吧index.php这入口文件放到根目录,那么我么需要改一下相对的引入文件的 ...

  2. 【React自制全家桶】五、React组件的生命周期函数详解

    一.总览React组件的生命周期函数 什么是生命周期函数:简单的来说就是 在某个时刻会自动执行的函数 二.React的生命周期函数主要由四块组成 分别是:组件初始化.组件挂载.组件更新.组件卸载 三. ...

  3. 菜鸟的周末_Python试水

    搭建开发环境 下载安装包,打开官网,选择最新Windows Installer版本下载. 运行安装包,勾选Add Python 3.8 to Path,选择Install Now,等待安装完成,直接关 ...

  4. 安德鲁1.2Ku全下125C波(CCTV4K除外)

    闲来无事.没事挑战下难度. 前面高楼挡住了,一直没有试过125, 没想到1.2的锅能全下 机器:恐龙机dinobot4K+ 天线:安德鲁1.2ku 接送结果:除4K外所有高清 图片如下

  5. Linux ospf+lvs

    待更新... https://my.oschina.net/lxcong/blog/143904?p=2&temp=1469345328746

  6. ubuntu go 开发环境搭建

    访问:https://golang.org/dl/ 下载 go1.12.4.linux-amd64.tar.gz wget https://dl.google.com/go/go1.12.4.linu ...

  7. .net代码混淆 .NET Reactor 研究 脚本一键混淆一键发布

    .net代码混淆 .NET Reactor 研究 为什么要混淆? .net比较适合快速开发桌面型应用,但缺点是发布出来的文件是可以反编译的,有时候为了客户的安全,我们的代码或者我们的逻辑不想让别人知道 ...

  8. ES5与ES6常用语法教程之 ①函数写法、创建对象、导入导出模块方式

    函数写法区别 计算a, b两个数字之和,有返回值 es5 写法 function add(a, b) { return a + b; } es6 写法(箭头函数) let add = (a, b) = ...

  9. python-阿里镜像源-pip

    将pip源设置为国内 >>>windows 1 地址栏输入%appdata% 2 新建pip文件价 3 文件夹里建pip.ini 内容: [global] timeout = 600 ...

  10. python-Web-django-图形验证

    import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random ...