送礼物「JSOI 2015」RMQ+01分数规划
【题目描述】
礼品店一共有N件礼物排成一列,每件礼物都有它的美观度。排在第\(i(1\leq i\leq N)\)个位置的礼物美观度为正整数\(A_I\)。JYY决定选出其中连续的一段,即编号为礼物\(i,i+1,…,j-1,j\)的礼物。选出这些礼物的美观程度定义为:\((M(i,j)-m(i,j))/(j-i+K)\),其中\(M(i,j)\)表示\(max\{A_i,A_{i+1}\dots A_j\}\),\(m(i,j)\)表示\(min\{A_i,A_{i+1}\dots A_j\}\),\(K\)为给定的正整数。
由于不能显得太小气,所以JYY所选礼物的件数最少为\(L\)件;同时,选得太多也不好拿,因此礼物最多选\(R\)件。JYY应该如何选择,才能得到最大的美观程度?由于礼物实在太多挑花眼,JYY打算把这个问题交给会编程的你。
【输入格式】
本题每个测试点有多组数据。输入第一行包含一个正整数\(T(T\leq 10)\),表示有T组数据。 每组数据包含两行,第一行四个非负整数\(N,K,L,R(2\leq L\leq R\leq N)\)。第二行包含\(N\)个正整数,依次表示\(A_1,A_2....A_n\),\((A_i\leq 10^8)\), \(N, K\leq 50,000\)。
【输出格式】
输出\(T\)行,每行一个非负实数,依次对应每组数据的答案,数据保证答案不会超过\(10^3\)。输出四舍五入保留4位小数。
【思路】
这题暴力还是比较好写的,直接枚举礼物件数。。。良心题目
下面是正解:
很明显较优的一个区间取法是取一段区间\([l, r]\)使得该区间最大值和最小值其中一个位于\(A[l]\),另一个位于\(A[r]\)。因为如果使用这种取法,对于每对该区间内的最小值和最大值,\((r - l + k)\)会尽量小。
所以分类讨论:
\(1.\)区间大小小于限制\(L\) 此时必须将区间大小扩大到\(L\) 直接用单调队列维护长度为\(L\)区间的最大最小值,分别计算\(n-L+1\)个区间。
\(2.\)二分答案\(x\)
对于一个区间\([L, R]\):
如果最大值在\(A[L]\)处,最小值在\(A[R]\)处,则有\(A[L]-A[R]-(R-L+K)*x > 0\); 若\(max((A[i]+i*mid)-(A[j]+j*mid)-k*mid)>=0\)则\(x\)可以继续扩大。
如果最大值在\(A[R]\)处,最小值在\(A[L]\)处,则计算\(max((A[i]-i*mid)-(A[j]-j*mid)-k*mid)\)是否大于0。
将\(k*mid\)移到不等式右边,剩下的\((A[i]-i*mid)\)最大值可以用单调队列维护。
可以每次枚举位于左端点或右端点当作最大值,然后在合法的范围内通过单调队列找出一个最小值进行计算。
这题就做完了 好像依然没讲清楚
上代码
#include <bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
ll t, n, k, l, r;
ll st1, st2, ed1, ed2;
ll que1[50005], que2[50005];
ll q[50005], head, tail;
ll a[50005];
double cur[50005];
double ans;
ll read() {
ll ret = 0, flag = 1;
char ch = getchar();
while (ch > '9' || ch < '0') {
if (ch == '-') flag = -1;
ch = getchar();
}
while (ch <= '9' && ch >= '0') {
ret = ret * 10 + ch - '0';
ch = getchar();
}
return ret * flag;
}
bool check(double mid) {
for (ri i = 1; i <= n; i++) {
cur[i] = a[i] - mid * i;
}
head = 1; tail = 0;
double nowans = -1e9;
for (ri i = l + 1; i <= n; i++) {
while (head <= tail && i - q[head] >= r) head++;
while (head <= tail && cur[q[tail]] >= cur[i - l]) tail--;
q[++tail] = i - l;
nowans = max(nowans, cur[i] - cur[q[head]]);
}
for (ri i = 1; i <= n; i++) {
cur[i] = a[i] + mid * i;
}
head = 1; tail = 0;
for (ri i = n - l; i >= 1; i--) {
while (head <= tail && q[head] - i >= r) head++;
while (head <= tail && cur[q[tail]] >= cur[i + l]) tail--;
q[++tail] = i + l;
nowans = max(nowans, cur[i] - cur[q[head]]);
}
return nowans >= k * mid;
}
int main() {
t = read();
while (t--) {
n = read(); k = read(); l = read(); r = read();
for (ri i = 1; i <= n; i++) {
a[i] = read();
}
st1 = st2 = 1;
ed1 = ed2 = 0;
for (ri i = 1; i < l; i++) {
while (st1 <= ed1 && a[que1[ed1]] >= a[i]) ed1--;
while (st2 <= ed2 && a[que2[ed2]] <= a[i]) ed2--;
que1[++ed1] = que2[++ed2] = i;
}
ans = -1e9;
for (ri i = l; i <= n; i++) {
while (st1 <= ed1 && i - que1[st1] >= l) st1++;
while (st2 <= ed2 && i - que2[st2] >= l) st2++;
while (st1 <= ed1 && a[que1[ed1]] >= a[i]) ed1--;
while (st2 <= ed2 && a[que2[ed2]] <= a[i]) ed2--;
que1[++ed1] = que2[++ed2] = i;
ans = max(ans, 1.0 * (a[que2[st2]] - a[que1[st1]]) / (l + k - 1));
}
double l = 0, r = 1005, mid;
while (r - l >= 1e-7) {
mid = (l + r) / 2;
if (check(mid)) {
l = mid + 0.000001;
ans = max(ans, mid);
} else r = mid - 0.000001;
}
printf("%.4lf\n", ans);
}
return 0;
}
送礼物「JSOI 2015」RMQ+01分数规划的更多相关文章
- GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ
题目描述 JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感.于是,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 ...
- [JSOI2016] 最佳团队 (树形DP+01分数规划)
Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...
- BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划
BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...
- POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9703 Accepted: 3299 ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
随机推荐
- 使用Optional摆脱NPE的折磨
在目前的工作中,我对Java中的Stream和Lambda表达式都使用得很多,之前也写了两篇文章来总结对应的知识. 024:Java流实现Shell:cat 1.log | grep a | sort ...
- 20190716 NOIP模拟测试4 考试反思
总分 127分 满分300 第一题 礼物 10分 一道期望题,看起来挺简单,但对于概率与期望这一块我还不怎么会,花了一个小时调他,最后只QJ了一下10%的测试点 第二题 通讯 90分 显然的缩点求解, ...
- Redis HyperLogLog用法简介
(1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 ...
- java学习笔记(基础篇)--java关键字与数据类型
java关键字与数据类型 Java语言的关键字是程序代码中的特殊字符.包括: . 类和接口的声明--class, extends, implements, interface . 包引入和包声明--i ...
- [记录]优化Linux 的内核参数来提高服务器并发处理能力
优化Linux 的内核参数来提高服务器并发处理能力PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题.要提高Linux 系统下的负载 ...
- mui.storage 将数据持久化到本地
在一个用mui做得app中,要求把历史记录放在本地(感觉...无法言喻的sd),但最终还是做了,以下来记录本次的学习到的内容 mui.plusReady(function() { //这里是一开始定义 ...
- 2017day1
http://www.cnblogs.com/alex3714/articles/5465198.html 四.Python安装 windows 1 2 3 4 5 6 7 1.下载安装包 h ...
- 为什么一直玩A股的股民转战去玩港美股了?港美股系统搭建!
今天先聊一下,为什么买港美股?不买 A 股? 1.A 股散户太多,港股美股机构居多. A 股市场,散户占据了70%以上交易份额,散户太多有什么坏处?少量的机构和大户很容易坐庄操控股价.A 股几乎所有票 ...
- mysql_fetch_assoc与mysql_fetch_array的区别
mysql_fetch_assoc与mysql_fetch_array的区别? 1. mysql_fetch_assoc : mysql_fetch_assoc() 函数从结果集中取得一行作为关联数组 ...
- python整型-浮点型-字符串-列表及内置函数(上)
整型 简介 # 是否可变类型: 不可变类型 # 作用:记录年龄.手机号 # 定义: age = 18 # --> 内部操作 age = int(18) # int('sada') # 报错 in ...