NKOJ 3775 数列操作(单调队列+DP)
来源:互联网 发布:ubuntu无法删除文件夹 编辑:程序博客网 时间:2024/05/20 11:27
P3775数列操作
问题描述
给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。
请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。
输入格式
第一行包含三个整数n,p,d(1<=d<=n<=300000,0<=p<=10^16)。
第二行包含n个正整数,依次表示序列中每个数wi。
输出格式
包含一行一个正整数,即修改后能找到的最长的符合条件的区间的长度。
样例输入
9 7 2
3 4 1 9 4 1 7 1 3
样例输出
5
由于要讨论区间和,所以先求出前缀和数组
所求的区间就是
考虑用单调队列优化,由于
代码:
#include<stdio.h>#include<iostream>#include<algorithm>#include<deque>#include<queue>#define ll long long#define N 333333using namespace std;struct node{ll v,x;};bool operator<(node a,node b){return a.v<b.v;}priority_queue<node>Q;deque<ll>P;node tmp;ll n,p,d,i,j,k,S[N],ans;int main(){ scanf("%lld%lld%lld",&n,&p,&d); for(i=1;i<=n;i++)scanf("%lld",&k),S[i]=S[i-1]+k; for(i=0;i<d;i++)P.push_back(i); for(i=d;i<=n;i++) { tmp.v=S[i]-S[i-d]; tmp.x=i-d; Q.push(tmp); P.push_back(i); while(P.size()&&p+S[P.front()]+Q.top().v<S[i]) { P.pop_front(); while(Q.size()&&Q.top().x<P.front())Q.pop(); } ans=max(ans,i-P.front()); } cout<<ans;}
阅读全文
0 0
- NKOJ 3775 数列操作(单调队列+DP)
- NKOJ 3768 数列操作(单调队列/栈+DP)
- NKOJ 3545 接近(DP+单调队列)
- NKOJ 3861 子矩阵(矩阵dp+单调队列)
- NKOJ-3775 数列操作
- NKOJ 2151【单调队列】烽火传递 单调队列优化DP
- NKOJ 2650 (SDOI 2011) 消防(树的直径+DP+单调队列/二分答案)
- NKOJ-3768 数列操作
- 【题】【单调队列】NKOJ3768 数列操作
- NKOJ 4244 (HAOI 2008) 木棍分割 (二分答案+DP+单调队列+前缀和优化+滚动数组)
- NKOJ 4241 (NOIP 2016)蚯蚓(单调队列)
- NKOJ 1533 玩具(三分+贪心+单调队列)
- dp单调队列(详解)
- NKOJ 2150 【单调队列】广告印刷
- NKOJ 2150 广告印刷 单调队列
- CF487B Strip(单调队列预处理+单调队列优化dp)
- NKOJ 4000 (AHOI 2013)差异(后缀自动机/后缀数组+线段树/单调队列)
- hdu Parade(单调队列优化 dp)
- sql
- 射线法判断一个点是否在多边形内
- Path Sum 2
- L2TP/VPN 实现断线重连(freescale MX28板子)
- java泛型
- NKOJ 3775 数列操作(单调队列+DP)
- 3174: [Tjoi2013]拯救小矮人
- ubuntu16.04安装eclipse+tomcat7+maven
- c++模板入门笔记
- OPENGL学习笔记之一
- 新的开始c++
- 移动群智感知应用学习
- jquery ajax向spring mvc controller中传值并接受及解析返回值
- 整理1