BZOJ 4385: [POI2015]Wilcze doły
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
3 4 1 9 4 1 7 1 3
Sample Output
HINT
将第4个和第5个数修改为0,然后可以选出区间[2,6],总和为4+1+0+0+1=6。
Source
分析
显然单调队列O(N)扫过去即可,就是注意优化常数。
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define gc getchar
#define add(x,y) x=x*10+y-'0' template <class T>
__inline void read(T &x)
{
x = ; char c = gc(); while (c < '')
c = gc(); while (c >= '')add(x,c),
c = gc();
} #define mem(x) memset(x,0,sizeof(x))
#define rep(x) for(int i=1;i<=x;++i) #define ll long long
#define LL long long #define N 4000005 int n;
int d;
int num[N];
int que[N]; LL p;
LL sum[N];
LL mex[N]; signed main(void)
{
read(n);
read(p);
read(d); rep(n)read(num[i]);
rep(n)sum[i] = sum[i - ] + num[i];
rep(n - d + )mex[i] = sum[i + d - ] - sum[i - ]; int h = , t = , lt = , ans = ; for (int i = d; i <= n; ++i)
{
while (h < t && mex[que[t - ]] <= mex[i - d + ])
--t; que[t++] = i - d + ; while (sum[i] - sum[lt] - mex[que[h]] > p)
{
++lt; while (que[h] <= lt)++h;
} if (i - lt > ans)ans = i - lt;
} printf("%d\n", ans);
}
BZOJ_4385.cpp
#include <bits/stdc++.h> typedef long long longint; const int maxn = ; int n;
int d;
int num[maxn];
int que[maxn]; longint p;
longint sum[maxn];
longint mex[maxn]; signed main(void)
{
scanf("%d%lld%d", &n, &p, &d); for (int i = ; i <= n; ++i)
scanf("%d", num + i); for (int i = ; i <= n; ++i)
sum[i] = sum[i - ] + num[i]; for (int i = ; i <= n - d + ; ++i)
mex[i] = sum[i + d - ] - sum[i - ]; int head = , tail = , left = , answer = ; for (int i = d; i <= n; ++i) {
while (head < tail && mex[que[tail - ]] <= mex[i - d + ])
--tail; // queue pop back que[tail++] = i - d + ; while (sum[i] - sum[left] - mex[que[head]] > p) {
++left;
while (que[head] <= left)
++head; // queue pop front
} if (answer < i - left)
answer = i - left;
} printf("%d\n", answer);
}
BZOJ_4385.cpp
@Author: YouSiki
BZOJ 4385: [POI2015]Wilcze doły的更多相关文章
- bzoj 4385: [POI2015]Wilcze doły【单调栈】
对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...
- [POI2015]Wilcze doły
[POI2015]Wilcze doły 题目大意: 给定一个长度为\(n(n\le2\times10^6)\)的数列\(A(1\le A_i\le10^9)\),可以从中选取不超过\(d\)个连续数 ...
- 【BZOJ4385】[POI2015]Wilcze doły 单调栈+双指针法
[BZOJ4385][POI2015]Wilcze doły Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段 ...
- 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$,则可行. ...
- BZOJ4385[POI2015]Wilcze doły——单调队列+双指针
题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入 第一行包含三个整数n,p ...
- 【bzoj4385】[POI2015]Wilcze doły
单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...
- [bzoj4385][POI2015]Wilcze doły_单调队列
Wilcze doły bzoj-4385 POI-2015 题目大意:给定一个n个数的序列,可以将连续的长度不超过d的区间内所有数变成0,求最长的一段区间,使得区间和不超过p. 注释:$1\le n ...
- P3594 [POI2015]WIL-Wilcze doły
P3594 [POI2015]WIL-Wilcze doły 题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得 ...
- bzoj 4386: [POI2015]Wycieczki
bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...
随机推荐
- 图片上传功能<转>http://blog.csdn.net/u011159417/article/details/50126023
以前也实现过上传,只不过每次都是,写完之后没有总结,下次遇到时,还要重新写,重新调式,很是浪费时间,所以,今天实现一个上传图片的功能,包括简单的页面和servlet,下次再要写这个功能时,直接拿过来就 ...
- matlab:启动后无法调用工具包
matlab有时候一打开会出现warning,然后任何工具包(包括set path)都执行不了,在网上找到解决方法,存下来备用. 1. 在matlab的command里输入: restoredefau ...
- QQ浏览器X5内核问题汇总
原文:http://itindex.net/detail/53391-qq-浏览器-x5 常常被人问及微信中使用的X5内核的问题,其实我也不是很清楚,只知道它是基于android 4.2的webkit ...
- vue 滚动加载
<template> <div class="wraper" @scroll="onScroll($event)"> <div c ...
- 使用gogs,drone搭建自动部署
使用gogs,drone搭建自动部署 使用gogs,drone,docker搭建自动部署测试环境 Gogs是一个使用go语言开发的自助git服务,支持所有平台Docker是使用go开发的开源容器引擎D ...
- JAVA CDI 学习(1) - @Inject基本用法
CDI(Contexts and Dependency Injection 上下文依赖注入),是JAVA官方提供的依赖注入实现,可用于Dynamic Web Module中,先给3篇老外的文章,写得很 ...
- 创建pathing jar
pathing jar是一个特殊的jar: 该jar文件只包含manifest.mf文件 该manifest文件只包含Class-Path,列出了所有需要真正加到classpath中的jar,或者di ...
- 如何对于几百行SQL语句进行优化?
1.最近在开发中遇到的一些关于几百行SQL语句做查询的问题,需要如何的解决优化SQL这确实是个问题,对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Su ...
- [转]Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
'dmesg'命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构.cpu.挂载的硬件,RAM等多个运行级别的大量的系统信息.当计算机启动时,系统内核(操作系统的核心部分)将会被加载到 ...
- 完整的社交app源码android+laravel
等想到写点什么的时候再写吧,其他看代码. https://github.com/huijimuhe/monolog-android https://github.com/huijimuhe/monol ...