[BZOJ4907]柠檬

2023-11-01 20:59
文章标签 柠檬 bzoj4907

本文主要是介绍[BZOJ4907]柠檬,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4709: [Jsoi2011]柠檬

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

Flute 很喜欢柠檬。它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬。贝壳一共有 N (1 ≤ N
≤ 100,000) 只,按顺序串在树枝上。为了方便,我们从左到右给贝壳编号 1..N。每只贝壳的大小不一定相同,
贝壳 i 的大小为 si(1 ≤ si ≤10,000)。变柠檬的魔法要求,Flute 每次从树枝一端取下一小段连续的贝壳,并
选择一种贝壳的大小 s0。如果 这一小段贝壳中 大小为 s0 的贝壳有 t 只,那么魔法可以把这一小段贝壳变成 s
0t^2 只柠檬。Flute 可以取任意多次贝壳,直到树枝上的贝壳被全部取完。各个小段中,Flute 选择的贝壳大小 s
0 可以不同。而最终 Flute 得到的柠檬数,就是所有小段柠檬数的总和。Flute 想知道,它最多能用这一串贝壳
变出多少柠檬。请你帮忙解决这个问题。

Input

第 1 行:一个整数,表示 N。
第 2 .. N + 1 行:每行一个整数,第 i + 1 行表示 si。

Output

仅一个整数,表示 Flute 最多能得到的柠檬数。

Sample Input

5
2
2
5
2
3

Sample Output

21
HINT:Flute 先从左端取下 4 只贝壳,它们的大小为 2, 2, 5, 2。选择 s0 = 2,那么这一段
里有 3 只大小为 s0 的贝壳,通过魔法可以得到 2×3^2 = 18 只柠檬。再从右端取下最后一
只贝壳,通过魔法可以得到 1×3^1 = 3 只柠檬。总共可以得到 18 + 3 = 21 只柠檬。没有
比这更优的方案了。
题解
膜一波ZYFdalao
首先我们需要分析出一个性质:同一段被取下的贝壳,其第一个和最后一个的大小一定是一样的.
证明很容易.用反证法来看,如果有一段贝壳,开头和结尾不一样,显然把这两段分开施法更优
这样,我们又可以想出一个暴力:每一个节点的最大价值f[i],肯定是由前面某一个和他权值相同的点转移而来
设出现次数为s[i],权值为a[i]
显然我们可以写出暴力式子:f[i]=max{f[j-1]+a[i]*(s[i]-s[j]+1)2,a[i]==a[j]}
但是这样肯定会T的,所以我们考虑优化
对于两个决策点j1和j2,设j1<j2
如果一开始f[j1-1]+a[i]*(s[i]-s[j1]+1)2<f[j2-1]+a[i]*(s[i]-s[j2]+1)2
随着i不断向后,由于平方的增速很快,越靠前的j位置,越有可能反超,使得f[j1-1]+a[i']*(s[i']-s[j1]+1) 2>f[j2-1]+a[i']*(s[i']-s[j2]+1) 2
所以我们就不能再用单调队列了,因为如果我们删去了前面的某个点,它在后面可能会变得更优
于是我们考虑用单调栈维护这个东西(单调栈的实现方法随意,我个人使用了vector)
每次决策的时候,我们就用栈顶来更新
由于一个贝壳可以自己画为一段,所以应该在插入之后再计算f值
当上述"反超"的情况出现时,肯定是最先发生在栈顶和栈顶第二个元素
假设我们已经插入因此我们就看,第二个元素有"多快"超过栈顶
这个所谓的"速度"用经过a[i]的个数来体现,也就是说,看第二个元素经过几个a[i]超过栈顶,记为cnt1,如果cnt1<=s[i],我们就可以弹栈了.
但是,可能会出现一种情况:第三个元素超过栈顶,而第二个元素还没有超过栈顶
设j2<j1<i2<i1,如果j2,j1,i2三者满足这种情况,那么j2,j1,i1肯定更加满足这种情况,所以直接删掉j1就行
所以,在我们插入之前,可以先进行一波上述弹栈:如果发现第二个元素超过栈顶比栈顶超过i快,就弹栈;
所以最后的顺序是:排查->插入->计算
代码见下:
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<deque>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long LL;
 8 const int N=100010;
 9 const int V=10010;
10 LL a[N],f[N];
11 int id[N],cnt[V],n;
12 vector<int>q[V];
13 inline int max(int a,int b){return a>b?a:b;}
14 inline LL calc(int x,int y){return f[x-1]+a[x]*y*y;}
15 inline int k(int x,int y)
16 {
17     int le=1,ri=n,ret=n+1;
18     while(le<=ri)
19     {
20         int mi=(le+ri)>>1;
21         if(calc(x,mi-id[x]+1)>=calc(y,mi-id[y]+1))
22             ret=mi,ri=mi-1;
23         else le=mi+1;
24     }
25     return ret;
26 }
27 int main()
28 {
29     scanf("%d",&n);int o;
30     for(int i=1;i<=n;i++)
31     {
32         scanf("%lld",&a[i]);o=a[i];
33         cnt[o]++,id[i]=cnt[o];
34         while(q[o].size()>=2&&k(q[o][q[o].size()-2],q[o][q[o].size()-1])<=k(q[o][q[o].size()-1],i))q[o].pop_back();
35         q[o].push_back(i);
36         while(q[o].size()>=2&&k(q[o][q[o].size()-2],q[o][q[o].size()-1])<=id[i])q[o].pop_back();
37         f[i]=calc(q[o][q[o].size()-1],id[i]-id[q[o][q[o].size()-1]]+1);
38     }
39     printf("%lld",f[n]);
40 }
BZOJ4907

转载于:https://www.cnblogs.com/LadyLex/p/7016771.html

这篇关于[BZOJ4907]柠檬的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325705

相关文章

cleanmymacX和腾讯柠檬到底哪个好用 2024最新使用测评

CleanMyMac X和腾讯柠檬都是Mac系统清理软件,各有其特点和优势,选择哪个更好用取决于用户的具体需求和使用习惯。 经常有新关注的粉丝问,同样做为垃圾清理软件,付费CleanMyMac和免费的柠檬清理哪个更好用?其实,两款软件都是属于非常成熟的软件,一个有着悠久的开发迭代历史,另一个更是背靠鹅厂金主爸爸,很难说谁更好用,毕竟好用不是一个可以清晰划分的定义。 不过我们还

mac清理软件推荐免费 mac清理系统数据怎么清理 cleanmymac和腾讯柠檬哪个好

macbook是苹果公司的一款高性能的笔记本电脑,受到了很多用户的喜爱。但是,随着使用时间的增长,macbook的系统也会积累一些垃圾文件,影响其运行速度和空间。那么,macbook系统清理软件推荐有哪些呢?macbook用什么清理系统垃圾呢?本文将为你介绍一款优秀的macbook系统清理软件,以及如何使用它来清理你的macbook系统垃圾。 一、macbook系统清理软件推荐 在市面上,

linux系统通用邮箱服务,linux系统发邮件必知必会-发送邮件的服务配置 - 橙子柠檬's Blog...

mutt+esmtp+shell,轻松实现邮件自动发送并且使用灵活,不需要MTA也能发信件 * fetchmail负责收信 * procmail负责过滤、分拣邮件 * mutt是邮件阅读、撰写工具 * esmtp负责发送邮件#系统环境 root@A-host ~]# cat /etc/redhat-release CentOS release 6.9 (Final) #1.安装 [root@A-

[JSOI2011] 柠檬(斜率优化DP,优化技巧)

题面描述 题面 简要题意:        给出一个长度为 n n n 的整数序列 s i s_i si​。可以将序列任意划分成若干非空连续段。对于每一段,可以选择一个整数 s 0 s_0 s0​,若该段 s 0 s_0 s0​ 的数量为 t t t,则该段的价值为 s 0 × t 2 s_0 \times t^2 s0​×t2。请求出每一段价值之和的最大值。        1

cleanmymacX和腾讯柠檬哪个好用

很多小伙伴在使用Mac时,会遇到硬盘空间不足的情况。遇到这种情况,我们能做的就是清理掉一些不需要的软件或者一些占用磁盘空间较大的文件来腾出空间。我们可以借助一些专门的清理工具,本文中我们来推荐几款好用的Mac知名的清理软件。并且将CleanMyMac X与腾讯柠檬两款软件进行对比,对比一下清理软件究竟哪个好。 Mac知名的清理软件  1、腾讯柠檬         腾讯柠檬是一款是在

柠檬微趣面试准备

简单介绍一下spring原理 Spring框架是一个开源的Java应用程序框架,它提供了广泛的基础设施支持,帮助开发者构建Java应用程序。Spring的设计原则包括依赖注入(DI)和面向切面编程(AOP)等,以促使代码的松耦合和更好的可维护性。 以下是Spring框架的一些关键原理: (1)依赖注入(Dependency Injection,DI): DI是Spring的核心原则之一,它通过

macos苹果电脑清理软件有哪些?cleanmymac和腾讯柠檬哪个好

MacOS是一款优秀的操作系统,但是随着使用时间的增加,它也会产生一些不必要的垃圾文件,占用磁盘空间和内存资源,影响系统的性能和稳定性。为了保持MacOS的清洁和高效,我们需要使用一些专业的清理软件来定期扫描和清除这些垃圾文件。 作为MacOS上最受欢迎的清理软件之一,CleanMyMac X的功能强大,可帮助您清理磁盘空间,优化系统性能并确保您的Mac运行顺畅。它具有直观的用户界面和易于使

测试人生 | 双非学历,从外包到某大厂只用了1年时间,在2线城市年薪近30万,我柠檬了......

本文为霍格沃兹测试学院优秀学员跳槽笔记,测试开发进阶学习文末加群。 大家好,很荣幸能跟大家分享一下自己经历,希望能给大家的就业与规划带来一些帮助。 本人就读于某双非本科院校非计算机或通信类相关专业,在经历了2年的某传统行业的“历练”后才下定决心转行到互联网行业。从转行至今,我有2年多接近3年的工作经验。 在霍格沃兹里学习后,我在某二线城市与某大厂「相见恨晚」,从开始面试到确认offer只花了一周

软件测试 | 测试开发 | 双非学历,从外包到某大厂只用了1年时间,在2线城市年薪近30万,我柠檬了......

本文为霍格沃兹测试学院优秀学员跳槽笔记,测试开发进阶学习文末加群。 大家好,很荣幸能跟大家分享一下自己经历,希望能给大家的就业与规划带来一些帮助。 本人就读于某双非本科院校非计算机或通信类相关专业,在经历了2年的某传统行业的“历练”后才下定决心转行到互联网行业。从转行至今,我有2年多接近3年的工作经验。 在霍格沃兹里学习后,我在某二线城市与某大厂「相见恨晚」,从开始面试到确认offer只花了一周时

mysql revoke ip 权限_MySQL表操作、修改权限 - 橙子柠檬's Blog

MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' grant update on testdb.