4385: [POI2015]Wilcze doły

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 648  Solved: 263
[Submit][Status][Discuss]

Description

给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。
请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。

Input

第一行包含三个整数n,p,d(1<=d<=n<=2000000,0<=p<=10^16)。
第二行包含n个正整数,依次表示序列中每个数w[i](1<=w[i]<=10^9)。

Output

包含一行一个正整数,即修改后能找到的最长的符合条件的区间的长度。

Sample Input

9 7 2
3 4 1 9 4 1 7 1 3

Sample Output

5

HINT

将第4个和第5个数修改为0,然后可以选出区间[2,6],总和为4+1+0+0+1=6。

Source

[Submit][Status][Discuss]

分析

显然单调队列O(N)扫过去即可,就是注意优化常数。

代码

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. #define gc getchar
  10. #define add(x,y) x=x*10+y-'0'
  11.  
  12. template <class T>
  13. __inline void read(T &x)
  14. {
  15. x = ; char c = gc();
  16.  
  17. while (c < '')
  18. c = gc();
  19.  
  20. while (c >= '')add(x,c),
  21. c = gc();
  22. }
  23.  
  24. #define mem(x) memset(x,0,sizeof(x))
  25. #define rep(x) for(int i=1;i<=x;++i)
  26.  
  27. #define ll long long
  28. #define LL long long
  29.  
  30. #define N 4000005
  31.  
  32. int n;
  33. int d;
  34. int num[N];
  35. int que[N];
  36.  
  37. LL p;
  38. LL sum[N];
  39. LL mex[N];
  40.  
  41. signed main(void)
  42. {
  43. read(n);
  44. read(p);
  45. read(d);
  46.  
  47. rep(n)read(num[i]);
  48. rep(n)sum[i] = sum[i - ] + num[i];
  49. rep(n - d + )mex[i] = sum[i + d - ] - sum[i - ];
  50.  
  51. int h = , t = , lt = , ans = ;
  52.  
  53. for (int i = d; i <= n; ++i)
  54. {
  55. while (h < t && mex[que[t - ]] <= mex[i - d + ])
  56. --t;
  57.  
  58. que[t++] = i - d + ;
  59.  
  60. while (sum[i] - sum[lt] - mex[que[h]] > p)
  61. {
  62. ++lt; while (que[h] <= lt)++h;
  63. }
  64.  
  65. if (i - lt > ans)ans = i - lt;
  66. }
  67.  
  68. printf("%d\n", ans);
  69. }

BZOJ_4385.cpp

  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long longint;
  4.  
  5. const int maxn = ;
  6.  
  7. int n;
  8. int d;
  9. int num[maxn];
  10. int que[maxn];
  11.  
  12. longint p;
  13. longint sum[maxn];
  14. longint mex[maxn];
  15.  
  16. signed main(void)
  17. {
  18. scanf("%d%lld%d", &n, &p, &d);
  19.  
  20. for (int i = ; i <= n; ++i)
  21. scanf("%d", num + i);
  22.  
  23. for (int i = ; i <= n; ++i)
  24. sum[i] = sum[i - ] + num[i];
  25.  
  26. for (int i = ; i <= n - d + ; ++i)
  27. mex[i] = sum[i + d - ] - sum[i - ];
  28.  
  29. int head = , tail = , left = , answer = ;
  30.  
  31. for (int i = d; i <= n; ++i) {
  32. while (head < tail && mex[que[tail - ]] <= mex[i - d + ])
  33. --tail; // queue pop back
  34.  
  35. que[tail++] = i - d + ;
  36.  
  37. while (sum[i] - sum[left] - mex[que[head]] > p) {
  38. ++left;
  39. while (que[head] <= left)
  40. ++head; // queue pop front
  41. }
  42.  
  43. if (answer < i - left)
  44. answer = i - left;
  45. }
  46.  
  47. printf("%d\n", answer);
  48. }

BZOJ_4385.cpp

@Author: YouSiki

BZOJ 4385: [POI2015]Wilcze doły的更多相关文章

  1. bzoj 4385: [POI2015]Wilcze doły【单调栈】

    对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...

  2. [POI2015]Wilcze doły

    [POI2015]Wilcze doły 题目大意: 给定一个长度为\(n(n\le2\times10^6)\)的数列\(A(1\le A_i\le10^9)\),可以从中选取不超过\(d\)个连续数 ...

  3. 【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法

    [BZOJ4385][POI2015]Wilcze doły Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段 ...

  4. BZOJ4385 : [POI2015]Wilcze doły

    求出前缀和$s$,设$f[i]=s[i+d-1]-s[i-1]$. 从左到右枚举的右端点$i$,左端点$j$满足单调性,若$s[i]-s[j-1]-\max(区间内最大的f)\leq p$,则可行. ...

  5. BZOJ4385[POI2015]Wilcze doły——单调队列+双指针

    题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...

  6. 【bzoj4385】[POI2015]Wilcze doły

    单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...

  7. [bzoj4385][POI2015]Wilcze doły_单调队列

    Wilcze doły bzoj-4385 POI-2015 题目大意:给定一个n个数的序列,可以将连续的长度不超过d的区间内所有数变成0,求最长的一段区间,使得区间和不超过p. 注释:$1\le n ...

  8. P3594 [POI2015]WIL-Wilcze doły

    P3594 [POI2015]WIL-Wilcze doły 题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得 ...

  9. bzoj 4386: [POI2015]Wycieczki

    bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...

随机推荐

  1. hadoop怎么读?怎么发音

    hadoop不是一个英文单词,是作者发明的词,hadoop名称来源作者小孩的一个}h毛填充黄色大象玩具. 它的发音是:[hædu:p]

  2. 【转】LiveWriter插入高亮代码插件介绍 基于SyntaxHighighter

    转自:http://www.cnblogs.com/yaoshiyou/archive/2009/11/25/1610901.html 插件介绍 辛苦了两人小时写日志不小心浏览器崩溃了,发誓以后一定记 ...

  3. sublime自定义快键键不行,

    其实sublime自身就有格式化命令,就不再安装插件,位置在[Edit]->[Line]->[Reindent]但这个默认的命令没有快捷键,就重新定义了一下,想用习惯了的eclipse快捷 ...

  4. 多个mapper location时, mybatis spring的自动扫描配置

    1. MapperScannerConfigurer 里面的basePackage, 多个package用逗号分隔 2. SqlSessionFactoryBean里面的mapperLocations ...

  5. page-cache层

    pagecache层内存管理 如果使用page,尤其对于32位系统来说,kmap & kunmap,可以把做struct *page与虚拟地址的映射 用kmap做一个临时的映射,然后通过kun ...

  6. usb驱动开发18之设备生命线

    现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符.接口描述符还是端点描述符都挤在一起,所以得想办法将 ...

  7. 探索Windows 8.1 Update 新功能点

    Windows 8.1 Update 已经使用一段时间了,整体感觉比Windows 8.1 方便了不少,尤其是对鼠标用户来说更是进行了很多优化. 应用磁贴尺寸 在应用磁贴点击鼠标右键,有小.中.宽.大 ...

  8. React Native 中组件的生命周期

    概述 就像 Android 开发中的 View 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命 ...

  9. 塔吊力矩限制器,塔吊黑匣子,塔吊电脑,tower crane

    塔机力矩限制器,tower crane 适用于各种类型的固定臂塔机和可变臂塔机 塔机力矩限制器是塔式起重机机械的安全保护装置,本产品采用32位高性能微处理器为硬件平台,软件算法采用国内最先进的三滑轮取 ...

  10. HTML5 postMessage 跨域交换数据

    前言 之前简单讲解了利用script标签(jsonp)以及iframe标签(window.name.location.hash)来跨域交换数据,今天我们来学习一下HTML5的api,利用postMes ...