【BZOJ】4709: [Jsoi2011]柠檬
4709: [Jsoi2011]柠檬
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 779 Solved: 310
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2
2
5
2
3
Sample Output
//Flute 先从左端取下 4 只贝壳,它们的大小为 2, 2, 5, 2。选择 s0 = 2,那么这一段
里有 3 只大小为 s0 的贝壳,通过魔法可以得到 2×3^2 = 18 只柠檬。再从右端取下最后一
只贝壳,通过魔法可以得到 1×3^1 = 3 只柠檬。总共可以得到 18 + 3 = 21 只柠檬。没有
比这更优的方案了。
HINT
Source
还没有学会斜率优化...可以直接单调栈,参考neither_nor的博客,在代码里面写了一点注释:
#include<iostream>
#include<cstdio>
#include<vector>
#define ll long long
using namespace std; int n, s, cnt[], pre[], color[];
vector < int > stk[];
ll f[]; ll count ( int x, int num ) {
return f[x-] + (ll)color[x] * num * num;
} int find ( int x, int y ) {//x,y是需要判断的下标,find的是x超过y的位置
int l = , r = n, res = n + ;
while ( l <= r ) {
int mid = ( l + r ) >> ;
if ( count ( x, mid - pre[x] + ) >= count ( y, mid - pre[y] + ) ) {//mid查找的是当前颜色的第几个入栈时间
res = mid; r = mid - ;
} else l = mid + ;
}
return res;
} int main ( ) {
scanf ( "%d", &n );
for ( int i = ; i <= n; i ++ ) {
scanf ( "%d", &s );
cnt[s] ++;
color[i] = s;
pre[i] = cnt[s];
while ( stk[s].size ( ) >= && find ( stk[s][stk[s].size ( ) - ], stk[s][stk[s].size ( ) - ] ) <=
find ( stk[s][stk[s].size ( ) - ], i ) ) stk[s].pop_back ( );//防止第二个元素超过栈顶的时间比栈顶超过i的时间早,此时栈顶没用
stk[s].push_back ( i );//先推入防止最后从0更新
while ( stk[s].size ( ) >= && find ( stk[s][stk[s].size ( ) - ], stk[s][stk[s].size ( ) - ] ) <=
pre[i] ) stk[s].pop_back ( );//i是这种颜色第pre[i]个入栈的 //第二个元素超过栈顶的时间比第一个元素进入的时间早,栈顶就没用了
f[i] = count ( stk[s][stk[s].size ( ) - ], pre[i] - pre[stk[s][stk[s].size ( ) - ]] + );
}
ll ans = ;
for ( int i = ; i <= n; i ++ )
ans = max ( ans, f[i] );
printf ( "%lld\n", ans );
return ;
}
【BZOJ】4709: [Jsoi2011]柠檬的更多相关文章
- bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 题解:https://blog.csdn.net/neither_nor/articl ...
- bzoj 4709: [Jsoi2011]柠檬
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从 ...
- bzoj 4709 [ Jsoi2011 ] 柠檬 —— 斜率优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 课上讲的题,还是参考了博客...:https://www.cnblogs.com/GX ...
- 4709: [Jsoi2011]柠檬
4709: [Jsoi2011]柠檬 https://www.lydsy.com/JudgeOnline/problem.php?id=4709 分析: 决策单调性+栈+二分. 首先挖掘性质:每个段选 ...
- 【BZOJ 4709】柠檬 斜率优化dp+单调栈
题意 给$n$个贝壳,可以将贝壳分成若干段,每段选取一个贝壳$s_i$,这一段$s_i$的数目为$num$,可以得到$num^2\times s_i$个柠檬,求最多能得到几个柠檬 可以发现只有在一段中 ...
- bzoj4709: [Jsoi2011]柠檬 斜率优化
题目链接 bzoj4709: [Jsoi2011]柠檬 题解 斜率优化 设 \(f[i]\) 表示前 \(i\)个数分成若干段的最大总价值. 对于分成的每一段,左端点的数.右端点的数.选择的数一定是相 ...
- 【BZOJ4709】[Jsoi2011]柠檬 斜率优化+单调栈
[BZOJ4709][Jsoi2011]柠檬 Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,0 ...
- 【LG5504】[JSOI2011]柠檬
[LG5504][JSOI2011]柠檬 题面 洛谷 题解 考虑\(dp\),令\(f_i\)表示\(dp\)到第\(i\)位且在第\(i\)位分段的最大值. 我们令题面中的\(s_i\)为\(a_i ...
- 笔记-[JSOI2011]柠檬
笔记-[JSOI2011]柠檬 [JSOI2011]柠檬 \(f_i\) 表示到第 \(i\) 只贝壳最多可以换得的柠檬数. 令 \(c_i=\sum_{h=1}^i[s_h=s_i]\). \[\b ...
随机推荐
- LOW逼三人组(二)----选择排序算法
选择排序思路: 算法程序: def cal_time(func): # 装饰器 ,用来检测算法所执行的时间 def wrapper(*args,**kwargs): t1=time.time() re ...
- 自定义ISO结构
流程: 1.OS安装 1.1 网卡配置 1.2 密码 1.3 语言 1.4 时区 1.5 分区 1.6 rpms ... 2.软件安装 2.1 BIC Server 2.2 APP Server 2. ...
- Linux下多路径multipath配置【转】
一.multipath在redhat 6.2中的基本配置: 1. 通过命令:lsmod |grep dm_multipath 检查是否正常安装成功.如果没有输出说明没有安装那么通过yum功能安装一下 ...
- Machine Learning系列--归一化方法总结
一.数据的标准化(normalization)和归一化 数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间.在某些比较和评价的指标处理中经常会用到,去除数据的单位限 ...
- TCP 建立的3次握手, 和关闭的4次握手
TCP/IP 寻址 TCP/IP 使用 32 个比特或者 4 个 0 到 255 之间的数字来为计算机编址. TCP/IP 连接 用S(service) 代表服务端, C(client) 代表客户端 ...
- Vue.js写一个SPA登录页面的过程
技术栈 vue.js 主框架 vuex 状态管理 vue-router 路由管理 一般过程 在一般的登录过程中,一种前端方案是: 检查状态:进入页面时或者路由变化时检查是否有登录状态(保存在cooki ...
- Linux中涉及到环境变量的文件
1. 系统级 (a) /etc/profile : 在用户登录操作系统时,定制用户环境的第一个文件,应用于登录的每一个用户 ==> 该文件一般调用/etc/bash.bashrc文件 (b)/e ...
- C/C++——库函数strcpy和strdup比较
版权声明:原创文章,禁止转载. 1. strcpy 原型: extern char *strcpy(char *dest,char *src); 用法: #include <string.h&g ...
- 关于VS2010的一些操作
自动插入接口实现 1: class MyClass : IMyInterface 2: { 3: 4: } .csharpcode, .csharpcode pre { font-size: sm ...
- C语言花括号
由于C语言本身就是函数式语言,说白了,C程序就是由函数构成的! 所以花括号肯定是用在函数之中,包括函数中的各种流程控制语句中. 实际上,C程序中花括号{}的作用:就是把多个单条语句用花括号{}括起来组 ...