【题目描述】

礼品店一共有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)\)最大值可以用单调队列维护。

可以每次枚举位于左端点或右端点当作最大值,然后在合法的范围内通过单调队列找出一个最小值进行计算。

这题就做完了 好像依然没讲清楚

上代码

  1. #include <bits/stdc++.h>
  2. #define ri register int
  3. using namespace std;
  4. typedef long long ll;
  5. ll t, n, k, l, r;
  6. ll st1, st2, ed1, ed2;
  7. ll que1[50005], que2[50005];
  8. ll q[50005], head, tail;
  9. ll a[50005];
  10. double cur[50005];
  11. double ans;
  12. ll read() {
  13. ll ret = 0, flag = 1;
  14. char ch = getchar();
  15. while (ch > '9' || ch < '0') {
  16. if (ch == '-') flag = -1;
  17. ch = getchar();
  18. }
  19. while (ch <= '9' && ch >= '0') {
  20. ret = ret * 10 + ch - '0';
  21. ch = getchar();
  22. }
  23. return ret * flag;
  24. }
  25. bool check(double mid) {
  26. for (ri i = 1; i <= n; i++) {
  27. cur[i] = a[i] - mid * i;
  28. }
  29. head = 1; tail = 0;
  30. double nowans = -1e9;
  31. for (ri i = l + 1; i <= n; i++) {
  32. while (head <= tail && i - q[head] >= r) head++;
  33. while (head <= tail && cur[q[tail]] >= cur[i - l]) tail--;
  34. q[++tail] = i - l;
  35. nowans = max(nowans, cur[i] - cur[q[head]]);
  36. }
  37. for (ri i = 1; i <= n; i++) {
  38. cur[i] = a[i] + mid * i;
  39. }
  40. head = 1; tail = 0;
  41. for (ri i = n - l; i >= 1; i--) {
  42. while (head <= tail && q[head] - i >= r) head++;
  43. while (head <= tail && cur[q[tail]] >= cur[i + l]) tail--;
  44. q[++tail] = i + l;
  45. nowans = max(nowans, cur[i] - cur[q[head]]);
  46. }
  47. return nowans >= k * mid;
  48. }
  49. int main() {
  50. t = read();
  51. while (t--) {
  52. n = read(); k = read(); l = read(); r = read();
  53. for (ri i = 1; i <= n; i++) {
  54. a[i] = read();
  55. }
  56. st1 = st2 = 1;
  57. ed1 = ed2 = 0;
  58. for (ri i = 1; i < l; i++) {
  59. while (st1 <= ed1 && a[que1[ed1]] >= a[i]) ed1--;
  60. while (st2 <= ed2 && a[que2[ed2]] <= a[i]) ed2--;
  61. que1[++ed1] = que2[++ed2] = i;
  62. }
  63. ans = -1e9;
  64. for (ri i = l; i <= n; i++) {
  65. while (st1 <= ed1 && i - que1[st1] >= l) st1++;
  66. while (st2 <= ed2 && i - que2[st2] >= l) st2++;
  67. while (st1 <= ed1 && a[que1[ed1]] >= a[i]) ed1--;
  68. while (st2 <= ed2 && a[que2[ed2]] <= a[i]) ed2--;
  69. que1[++ed1] = que2[++ed2] = i;
  70. ans = max(ans, 1.0 * (a[que2[st2]] - a[que1[st1]]) / (l + k - 1));
  71. }
  72. double l = 0, r = 1005, mid;
  73. while (r - l >= 1e-7) {
  74. mid = (l + r) / 2;
  75. if (check(mid)) {
  76. l = mid + 0.000001;
  77. ans = max(ans, mid);
  78. } else r = mid - 0.000001;
  79. }
  80. printf("%.4lf\n", ans);
  81. }
  82. return 0;
  83. }

送礼物「JSOI 2015」RMQ+01分数规划的更多相关文章

  1. GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ

    题目描述 JYY和CX的结婚纪念日即将到来,JYY来到萌萌开的礼品店选购纪念礼物.萌萌的礼品店很神奇,所有出售的礼物都按照特定的顺序都排成一列,而且相邻的礼物之间有一种神秘的美感.于是,JYY决定从中 ...

  2. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  3. [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) ...

  4. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  5. [JSOI 2016] 最佳团体(树形背包+01分数规划)

    4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2003  Solved: 790[Submit][Statu ...

  6. [JSOI2016] 最佳团队 (树形DP+01分数规划)

    Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...

  7. BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划

    BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...

  8. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  9. ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)

    [题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...

随机推荐

  1. Parameters.AddWithValue(“@参数”,value)方法

    以前用command方法执行存储过程增加参数时,总是先用cmd.Parameters.Add方法来设置参数和参数类型,再用Parameters[0].Value来给参数赋值.以前的一个动作代码示例: ...

  2. java高并发系列-第1天:必须知道的几个概念

    java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...

  3. [译]Vulkan教程(33)多重采样

    [译]Vulkan教程(33)多重采样 Multisampling 多重采样 Introduction 入门 Our program can now load multiple levels of d ...

  4. EnjoyingSoft之Mule ESB开发教程系列第五篇:控制消息的流向-数据路由

    目录 1. 使用场景 2. 基于消息头的路由 2.1 使用JSON提交订单的消息 2.2 使用XML提交订单的消息 2.3 使用Choice组件判断订单格式 3. 基于消息内容的路由 4. 其他控制流 ...

  5. Win10更新后,MySQL服务莫名消失的问题

    手欠的给Win10更新,之后就发现右下角托盘里的小海豚变成白色的了,最后确认MySQL服务丢失 解决办法1: 1.重新安装服务:mysqld --install 2.如果之前没有自定义数据保存路径(d ...

  6. 扫描线——POJ1151

    平面上有若干个矩形,求矩形相互覆盖的面积.为方便起见,矩形的边均平行于坐标轴. 我们根据容斥原理,矩形相互覆盖的面积即为所有矩形的面积和减去所有矩形所覆盖的面积即可. 而现在问题是如何求得所有矩形所覆 ...

  7. HDU5521 Meeting(dijkstra+巧妙建图)

    HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...

  8. Sublime Text 3 实现C++代码的编译和运行

    在数据结构代码的编写中,我选用了优秀的编辑器 Sublime Text 3,但是在实现C++代码的编译和运行上费了一番周折,接下来我贴出 C++ 编译系统的代码,供各位参考. 编译后是在弹出的CMD命 ...

  9. C#3.0新增功能09 LINQ 标准查询运算符 04 运算

    连载目录    [已更新最新开发文章,点击查看详细] 本篇主要介绍标准查询运算符的常用运算功能. 01 对数据排序 排序操作基于一个或多个属性对序列的元素进行排序. 第一个排序条件对元素执行主要排序. ...

  10. JS面向对象编程(一):封装

    js是一门基于面向对象编程的语言.      如果我们要把(属性)和(方法)封装成一个对象,甚至要从原型对象生成一个实例,我们应该怎么做呢?  一.生成对象的原始模式            假定把猫看 ...