题意:给定长度为N的数组,求一段连续的元素之和大于等于K,并且让这段元素的长度最小,输出最小长度即可,若不存在这样的元素集合,则输出-1

题目链接:UVAlive 6609

做法:做一个前缀和prefix,然后再作一个维护前缀和最大值数组Max,枚举所有可能的起始点i,在Max上二分末尾位置r,由于Max维护的是前缀和的最大值,因此具有单调性,可以进行二分,似乎还有其他O(n)的做法,有空去膜一下

代码:

  1. #include <stdio.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define INF 0x3f3f3f3f
  5. #define LC(x) (x<<1)
  6. #define RC(x) ((x<<1)+1)
  7. #define MID(x,y) ((x+y)>>1)
  8. #define CLR(arr,val) memset(arr,val,sizeof(arr))
  9. #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
  10. typedef pair<int, int> pii;
  11. typedef long long LL;
  12. const double PI = acos(-1.0);
  13. const int N = 500010;
  14. LL arr[N];
  15. LL Max[N][20];
  16. LL prefix[N];
  17.  
  18. void init()
  19. {
  20. CLR(Max, -0x3f3f3f3f3f3f3f3f);
  21. prefix[0] = 0LL;
  22. }
  23. void RMQ_init(int l, int r)
  24. {
  25. int i, j;
  26. for (i = l; i <= r; ++i)
  27. Max[i][0] = max<LL>(Max[i][0], prefix[i]);
  28. for (j = 1; l + (1 << j) - 1 <= r; ++j)
  29. {
  30. for (i = l; i + (1 << j) - 1 <= r; ++i)
  31. {
  32. Max[i][j] = max<LL>(Max[i][j - 1], Max[i + (1 << (j - 1))][j - 1]);
  33. }
  34. }
  35. }
  36. LL ST(int l, int r)
  37. {
  38. int k = log2(r - l + 1);
  39. return max<LL>(Max[l][k], Max[r - (1 << k) + 1][k]);
  40. }
  41. int main(void)
  42. {
  43. int tcase, n, i;
  44. LL k;
  45. scanf("%d", &tcase);
  46. while (tcase--)
  47. {
  48. init();
  49. scanf("%d%lld", &n, &k);
  50. for (i = 1; i <= n; ++i)
  51. {
  52. scanf("%lld", &arr[i]);
  53. prefix[i] = prefix[i - 1] + arr[i];
  54. }
  55. RMQ_init(1, n);
  56. int ans = INF;
  57. for (i = 1; i <= n; ++i)
  58. {
  59. int L = i, R = n;
  60. int temp = -1;
  61. while (L <= R)
  62. {
  63. int mid = (L + R) >> 1;
  64. LL Get = ST(i, mid);
  65. if (Get - prefix[i - 1] >= k)
  66. {
  67. temp = mid;
  68. R = mid - 1;
  69. }
  70. else
  71. L = mid + 1;
  72. }
  73. if (~temp)
  74. ans = min(ans, temp - i + 1);
  75. }
  76. printf("%d\n", ans == INF ? -1 : ans);
  77. }
  78. return 0;
  79. }

UVALive 6609 Minimal Subarray Length(RMQ-ST+二分)的更多相关文章

  1. UVALive 6609 Minimal Subarray Length (查找+构建排序数组)

    描述:给定n个整数元素,求出长度最小的一段连续元素,使得这段元素的和sum >= X. 对整个数组先求出sum[i],表示前i个元素的和,然后依次求出以a[i]为起点的,总和>= X的最小 ...

  2. 6609 - Minimal Subarray Length

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  3. UVA 12697 Minimal Subarray Length

    Minimal Subarray Length Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...

  4. E - Minimal Subarray Length(连续区间和)

    题目链接 题意:给出n个数,求加和大于x的最短区间的区间长度. 如果前i个数字和为y,那么如果前j数字的和小于等于y-x,那么i-j就是一种可能的情况,我们对于所有的i找出前面最大的j就可以了,因为数 ...

  5. hdu 3183 A Magic Lamp RMQ ST 坐标最小值

    hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...

  6. NYOJ 119 士兵杀敌(三) RMQ ST

    NYOJ 119 士兵杀敌(三) RMQ ST 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119 思路: ST在线 预处理O(nlog ...

  7. lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增

    https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...

  8. 求解区间最值 - RMQ - ST 算法介绍

    解析 ST 算法是 RMQ(Range Minimum/Maximum Query)中一个很经典的算法,它天生用来求得一个区间的最值,但却不能维护最值,也就是说,过程中不能改变区间中的某个元素的值.O ...

  9. HDU 5875 Function st + 二分

    Function Problem Description   The shorter, the simpler. With this problem, you should be convinced ...

随机推荐

  1. Airflow 调度基础

    1. Airflow Airflow是一个调度.监控工作流的平台.用于将一个工作流制定为一组任务的有向无环图(DAG),并指派到一组计算节点上,根据相互之间的依赖关系,有序执行. 2. 安装 pip安 ...

  2. cf1151 B

    题目连接 : https://codeforces.com/contest/1151/problem/B 可能我想法有问题,我怎么感觉B题的思路不直接想出来的,我想了一会才想出来,感觉不难,但可能有更 ...

  3. Java代码工具箱之链接Oracle

    1. 需要oracle的 odbc  jar包 2. 代码 3. 注意:ps对象和statement对象最好用完立即释放,尤其是读写数据库代码出现在 for 循环语句中时. 否则会出现游标不够的情况, ...

  4. 事件流,事件对象和jQuery

    事件流 多个彼此嵌套元素,他们拥有相同的事件,最内部元素事件被触发后,外边多个元素的同类型事件也会被触发,多个元素他们同类型事件同时执行的效果称为“事件流” 例子:html代码: <div cl ...

  5. 表格和网页ico图标

    表格: 表格格式: <table> <tr> 表格的行 <th >表头</th> <th>表头 </th> </tr> ...

  6. zabbix 密码忘记了如何恢复

    1.进入数据库 2.使用zabbix的数据库 use zabbix: 3.查看表信息 show tables; 4.搜索users表 select * from users; 5.修改userid为1 ...

  7. Linux更改文件权限(二)

    更改文件权限(二)============================== (参考于千锋教育教学笔记) 命令umask [root@aminglinux ~]# umask 0022 [root@ ...

  8. java中常用的swing组件 (2013-10-27-163 写的日志迁移

    五种布局:   流式布局(FlowLayout)边界布局(borderLayout)网格布局(GridLayout)  盒子布局(BoxLaYout)  空布局(null)  常用的几种 卡片布局(C ...

  9. 16.VUE学习之-v-show的使用与v-if的差异对比

    v-show的使用与v-if的差异对比 相同点: 都可以达到隐藏和显示的效果. 不同点: v-show 会用display:none 来隐藏元素节点,推荐使用这种方式 v-if 会移除节点,可以配合v ...

  10. django_mysql_配置

    配置 1. 安装Pymysql pip install PyMySQL 然后在项目同名_init__添加 from pymysql import install_as_MySQLdb install_ ...