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\)轮,每一轮按照编号从小到大依次考虑,如果这张牌已经发动过则跳过该牌 ...
随机推荐
- Java中四种遍历Map对象的方法
方法一:在for-each循环中使用entry来遍历,通过Map.entrySet遍历key和value,这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Int ...
- ES5 Object.assign 低版本浏览器内核兼容问题
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { ...
- mysql 命令行个性化设置
通过配置显示主机和用户名 mysql -u root -p --prompt="(\u@\h) [\d]>" 或在配置文件中修改,可在命令行中的目标位置查看 --tee na ...
- Codeforces1307D. Cow and Fields
对于本题,最短路,考虑bfs,那么我们可以跑2次bfs,求出每个点到1与n的最短路,设为x_a, x_b,那我们可以把问题转换成max(min{x_a+y_b,x_b+y_a}+1)(x,y属于1到n ...
- Java小菜鸟的一些经历
写在前面 自接触编程以来,从最初看到hello world显示成功时的激动,到现在看到代码大片报错时的无奈, 虽然只有短短一年左右的时间,但感觉自己经历颇多,于是,有了把自己的经历与经验分享给他人的想 ...
- Lesson 12 banks and their customers
Why is there no risk to the customer when a bank prints the customer's name on his cheques? When any ...
- vue dialog每次打开会展示上一次数据(转载)
原文地址: (https://www.jianshu.com/p/82b6681d0768) 在dialog外套一层div,div中以v-if来控制组件el-dialog的出现与否,每次弹出el-di ...
- [网络必学]TCP/IP四层模型讲解【笔记整理通俗易懂版】
OSI七层模型 表示层:用来解码不同的格式为机器语言,以及其他功能. 会话层:判断是否需要网络传输. 传输层:识别端口来指定服务器,如指定80端口的www服务. 网络层:提供逻辑地址选路,即发 ...
- ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
背景:elasticsearch 进行排序的时候,可能会排序数字.日期.但是在排序text类型的时候就会出现上述错误 原因(参考): https://blog.csdn.net/wild46cat/a ...
- ionic3记录之栅格布局使文字居中
{ display:flex; align-items:center; } 未完待续...