P3594 [POI2015]WIL-Wilcze doły
P3594 [POI2015]WIL-Wilcze doły
题目描述
给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。
输入格式:
第一行包含三个整数n,p,d(1<=d<=n<=2000000,0<=p<=10^16)。第二行包含n个正整数,依次表示序列中每个数wi。
调试日志: 开始 p 和 d 输反了。。。查了半天、、老想自己哪里想错了QAQ
Solution
首先感性认识一下, 随着某一特定的右端点的增加, 其对应的最优左端点是会增加的
也就是说左端点随着右端点的单调递增
贪心认识一下, 由于元素大小大于0, 消去的能选满一定选满
所以处理出 \(maxx[i]\) 表示以 \(i\) 作为起点, (在不越界的情况下)选满的值
因为左端点随右端点单调递增
我们枚举每一个右端点, 同时单调队列处理出现区间内的最大能消去值 \(M\)
若是仍 \(sum[i] - sum[now - 1] - M > p\) 那么只好更新左端点了
每次更新 \(ans\) 即可
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(LL i = (x);i <= (y);i++)
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 4000019;
LL num, d, p;
LL a[maxn];
LL maxx[maxn];//以i开头的满长消去值
LL sum[maxn];
void init(){
num = RD(), p = RD(), d = RD();
REP(i, 1, num)a[i] = RD(), sum[i] = sum[i - 1] + a[i];
REP(i, 1, num){
LL now = i + d - 1 > num ? sum[num] : sum[i + d - 1];
maxx[i] = now - sum[i - 1];
}
}
struct Que{
LL val, Index;
}Q[maxn];//存maxx
LL head = 1, tail = 0;
void push_back(LL v, LL i){
while(head <= tail && Q[tail].val <= v)tail--;
Q[++tail] = (Que){v, i};
}
LL now;//目前真实队列的队头
LL get_max(){
while(head <= tail && Q[head].Index < now)head++;
return Q[head].val;
}
LL ans;
void solve(){
now = 1;
REP(i, d, num){
push_back(maxx[i - d + 1], i - d + 1);
LL M = get_max();
while(sum[i] - sum[now - 1] - M > p)now++, M = get_max();
ans = max(ans, i - now + 1);
}
printf("%lld\n", ans);
}
int main(){
init();
solve();
return 0;
}
CG

P3594 [POI2015]WIL-Wilcze doły的更多相关文章
- BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
- [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 ...
- bzoj 4385: [POI2015]Wilcze doły【单调栈】
对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和-当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈 ...
- 【bzoj4385】[POI2015]Wilcze doły
单调队列扫描,记录当前区间长度为d的一段的和的最大值,和当前区间和. #include<algorithm> #include<iostream> #include<cs ...
- bzoj4385 Wilcze doły
Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...
- bzoj4385 & POJ2015 Wilcze doły
Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...
随机推荐
- Leetcode 546. Remove Boxes
题目链接: https://leetcode.com/problems/remove-boxes/description/ 问题描述 若干个有序排列的box和它们的颜色,每次可以移除若干个连续的颜色相 ...
- Scapy的使用
0.前言 最近现场测试项目时,突如其来需要伪造IGMP报文,骗取交换机相关组播流量,慌忙之下学习了Scapy的使用,以及相关快速学习的方法,在这里分享下. 1.Scapy库安装 github地址:ht ...
- 《ERP系统修正数据的sql文件》
第一 1.修正销售客户创建者的sql脚本: UPDATE e_sales_customers sc SET sc.user_id = ( SELECT tmp.user_id FROM ( SELEC ...
- rabbitmq安装与使用总结
一.随着公司业务量的增加,原本部署在Windows服务器的RabbitMQ集群(3.6.1)总是出现莫名其妙的问题,经查询官方Issue,确认是RabbitMQ 3.6.1 版本的bug.查看从3.6 ...
- AXI4
axis AXI4-stream 去掉了地址项,允许无限制的数据突发传输规模: 摘自http://xilinx.eetrend.com/blog/11443
- ceph 搭建nginx负载3个对象网关
nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid ...
- BZOJ3834[Poi2014]Solar Panels——分块
题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...
- BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】
题目分析: 这道题是数学必修五的原题,做法如下图,书上讲得很详细了. 那么这道题目用快速幂就可以解决了,值得注意的是,分析时间复杂度会发现直接做乘法其实是O(n^2)的,但是有一个1/20左右的常数, ...
- MT【62】柯西求三角值域
求$sinx(\sqrt{cos^2x+24}-cosx)$的范围. 解答:[-5,5] $$\because (sinx \sqrt{cos^2x+24}-cosxsinx)^2$$ $$\le ( ...
- oracle导出导入数据库
一.给空表分配空间: 这一步一定要做,否则空表不能导出. 首先连接你要导出的库,在该库上执行以下sql: select 'alter table '||table_name||' allocate e ...