GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ
题目描述
JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物。萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感。于是,JYY决定从中挑选连续的一些礼物,但究竟选哪些呢?假设礼品店一共有N件礼物排成一列,每件礼物都有它的美观度。排在第i(1\leq i\leq N1≤i≤N)个位置的礼物美观度为正整数A_iAi。JYY决定选出其中连续的一段,即编号为礼物i,i+1,…,j-1,ji,i+1,…,j−1,j的礼物。选出这些礼物的美观程度定义为:
(M(i,j)-m(i,j))/(j-i+k)(M(i,j)−m(i,j))/(j−i+k),其中M(i,j)M(i,j)表示max\{A_i,A_{i+1}....A_j\}max{Ai,Ai+1....Aj},m(i,j)m(i,j)表示min\{A_i,A_{i+1}....A_j\}min{Ai,Ai+1....Aj},K为给定的正整数。
由于不能显得太小气,所以JYY所选礼物的件数最少为L件;同时,选得太多也不好拿,因此礼物最多选R件。JYY应该如何选择,才能得到最大的美观程度?由于礼物实在太多挑花眼,JYY打算把这个问题交给会编程的你。
法一:用单调暴力求解,然后你就可以得到宝贵的20分(本人亲自实验)。
法二(正解):
若区间长度等于规定L,就直接用单调队列维护长度为L的区间的最大值和最小值,分别计算每个区间,用一个ans记录最大值。
若区间大于L,对于一个区间[l, r]很明显可以发现最优的取法是在A[l]为最小值, A[r]为最大值或A[l]为最小值,A[r]为最大值。
然后开始二分答案。
judge函数:
1, A[l] > A[r], 要A[l] - A[r] > (r - l + 1) * mid; 所以若max{A[i] + i * mid - (A[j] - j * mid) - k * mid} >= 0则mid可以更大
2,若A[l] < A[r] 同理,反过来就行。
所有A[i] + i * mid, A[j] - j * mid用单调队列来维护。
#include <bits/stdc++.h>
using namespace std;
const long long MAX = ;
const double INF = 1e9;
long long t, n, k, l, r;
long long a[MAX], q1[MAX], q2[MAX], q[MAX];
double val[MAX];
double ans;
//读入优化
double read() {
double ret = , f = ;
char ch = getchar();
while ('' > ch || ch > '') {
if (ch == '-') f = -;
ch = getchar();
}
while ('' <= ch && ch <= '') {
ret = ret * + ch - '';
ch = getchar();
}
return ret * f;
}
//判断
bool judge(double m) {
double ret = -INF;
for (long long i = ; i <= n; i++) {
val[i] = a[i] - m * i;
}
long long head = , tail = ;
for (long long i = l + ; i <= n; i++) {
while (head <= tail && i - q[head] >= r) head++;
while (head <= tail && val[q[tail]] >= val[i - l]) tail--;
q[++tail] = i - l;
ret = max(ret, val[i] - val[q[head]]);
}
for (long long i = ; i <= n; i++) {
val[i] = a[i] + m * i;
}
head = , tail = ;
for (long long i = n - l; i >= ; i--) {
while (head <= tail && q[head] - i >= r) head++;
while (head <= tail && val[q[tail]] >= val[i + l]) tail--;
q[++tail] = i + l;
ret = max(ret, val[i] - val[q[head]]);
}
//k是题目给的常数
return ret >= k * m;
}
int main() {
t = read();
while (t--) {
ans = -INF;
n = read(), k = read(), l = read(), r = read();
for (long long i = ; i <= n; i++) a[i] = read();
long long h1 = , h2 = , t1 = , t2 = ;
for (long long i = ; i < l; i++) {
while (h1 <= t1 && a[q1[t1]] >= a[i]) t1--;
while (h2 <= t2 && a[q2[t2]] <= a[i]) t2--;
q1[++t1] = q2[++t2] = i;
}
for (long long i = ; i <= n; i++) {
while (h1 <= t1 && i - q1[h1] >= l) h1++;
while (h2 <= t2 && i - q2[h2] >= l) h2++;
while (h1 <= t1 && a[q1[t1]] >= a[i]) t1--;
while (h2 <= t2 && a[q2[t2]] <= a[i]) t2--;
q1[++t1] = q2[++t2] = i;
ans = max(ans, 1.0 * (a[q2[h2]] - a[q1[h1]]) / (l + k - ));
}
//注意精度
double l = , r = ;
while (r - l >= 0.000001) {
double mid = (l + r) / ;
if (judge(mid)) ans = max(ans, mid), l = mid + 0.000001;
else r = mid - 0.000001;
}
printf("%.4lf\n", ans);
}
return ;
}
GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ的更多相关文章
- 送礼物「JSOI 2015」RMQ+01分数规划
[题目描述] 礼品店一共有N件礼物排成一列,每件礼物都有它的美观度.排在第\(i(1\leq i\leq N)\)个位置的礼物美观度为正整数\(A_I\).JYY决定选出其中连续的一段,即编号为礼物\ ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- [BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表)
[BZOJ4476] [JSOI2015] 送礼物 (01分数规划+ST表) 题面 给出n,k,l,r和序列a,要求从a中选一段连续的区间[i,j]出来,使得M(i,j)-m(i,j)/(j-i+k) ...
- P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...
- [JSOI 2016] 最佳团体(树形背包+01分数规划)
4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2003 Solved: 790[Submit][Statu ...
- 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ
[BZOJ4476][Jsoi2015]送礼物 Description JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成 ...
- 极光的开源礼物「Aurora IMUI」
今日,奉上我们拙作,仅为开源世界献出绵薄之力. Aurora IMUI,一个通用的即时通讯(IM)UI 库.不局限于任何 IM SDK. 本 UI 库提供了消息列表.输入视图等常用组件. 初心 过去的 ...
- 「HNOI 2015」实验比较
\(Description\) 有\(n\)个元素,对于每个元素\(x_i\)最多知道一个形如\(x_j < x_i\)或\(x_j=x_i\)的条件,问有多少合法的序列.合法的序列满足每个元素 ...
- 「HNOI 2015」亚瑟王
\(Description\) 有\(n\)张卡牌,每一张卡牌有\(p_i\)的概率发动,并造成\(d_i\)点伤害.一共有\(r\)轮,每一轮按照编号从小到大依次考虑,如果这张牌已经发动过则跳过该牌 ...
随机推荐
- c++刷算法的好处
写再最前面:摘录于柳神的笔记 在已经学习过C语⾔的前提下,学习C++并使⽤它刷算法的学习成本⾮常低-只需要⼏个⼩时就可 以学会- C++向下兼容C,C语⾔⾥⾯的语法完全可以在C++⽂件中运⾏,所以学习 ...
- C语言入门---第七章 C语言函数
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码.函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接收数据, ...
- c++将字符转换成字符串
转载:https://blog.csdn.net/dididisailor/article/details/83189135 char c; string str; stringstream stre ...
- Markdown 语法使用
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,被广泛的应用在博客写 ...
- 「Luogu P1383 高级打字机」
一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...
- 计划任务之一次性计划任务(at)和周期性计划任务(crontab)(重点)
一:知识要点 ----计划任务的意义----计划任务分类----用户计划任务crontab----系统计划任务----计划任务使用注意事项----anacron服务介绍 二:计划任务的意义计划任务 - ...
- cookie、sessionStorage和localStorage的区别
cookie.sessionStorage.localStorage 都是用于本地存储的技术:其中 cookie 出现最早,但是存储容量较小,仅有4KB:sessionStorage.localSto ...
- 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185
最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...
- Red_Hat yum源配置
http://www.linuxidc.com/Linux/2016-06/132171.htm
- Java垃圾回收机制详解和调优
gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集 ...