首页 > 其他分享 >单调队列优化DP

单调队列优化DP

时间:2022-11-11 10:59:45浏览次数:60  
标签:le 队列 sum long DP 区间 单调 指针

[POI2015] WIL

题目描述

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

输入格式

输入的第一行包含三个整数,分别代表 \(n,p,d\)。

第二行包含 \(n\) 个整数,第 \(i\) 个整数代表序列中第 \(i\) 个数 \(w_i\)。

输出格式

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

样例 #1

样例输入 #1

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

样例输出 #1

5

提示

【数据范围】

对于 \(100\%\) 的数据,\(1 \le d \le n \le 2 \times 10^6\),\(0 \le p \le 10^{16}\),\(1 \leq w_i \leq 10^9\)。


原题名称:Wilcze doły。

这题如果没有 可以删除\(d\)个数的操作显然可以用双指针做
若找到一个不合法区间考虑要删掉区间中\(d\)个数,贪心的想肯定要删去和最大的那几个
设\(sum\)为前缀和
则一个区间的总和为\(sum_{r}-sum_{l-1}-(sum_{x}-sum_{x-d})\)
依然使用双指针来做若暴力找最大\(sum_{x}-sum_{x-d}\)显然时间复杂度会炸,应为双指针左右端点只会往右移动所以可以用单调队列来维护\(sum_{x}-sum_{x-d}\)的区间最大值即单调队列所维护的区间与双指针一样跟着双指针一块动

凡是涉及到指针的代码我都得调半天

std:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e6+9;
long long n,d,ans,a[N],l,sum[N],h,t,q[N];
long long p;
signed main() {
	scanf("%lld%lld%lld",&n,&p,&d);
	for(int i =1 ;i <= n;i++)scanf("%d",&a[i]),sum[i] = sum[i - 1] + a[i];
	ans = d, q[t] = d, l = 1;
	for(int i = d+1 ;i <= n;i++)
	{
		while(h <= t && sum[i]-sum[i-d] > sum[q[t]] - sum[q[t]-d])--t;
		q[++ t] = i;
		while(h <= t && sum[i]-sum[l-1] - sum[q[h]] + sum[q[h]-d] > p) 
		{
			l++;
			while(h <= t&&q[h]-d+1 < l) ++ h;
		}
		ans = max(ans, i-l+1);
	}
	
	printf("%lld", ans);
	return 0;
}

标签:le,队列,sum,long,DP,区间,单调,指针
From: https://www.cnblogs.com/AC7-/p/16879836.html

相关文章

  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.AbortPolicy​​​​2.DiscardPolicy​​​​3.DiscardOldestPolicy​​​​4.CallerRunsPolicy​​​​5.自......
  • 斐波那契dp
    21,斐波那契概念如果是dp,就同个子问题得到当前问题方程\[F[i]=F[i-1]+F[i-2]\]代码//优化版本classSolution{public:intFibonacci(intn){intfr......
  • 20221007_T1A-_贪心/树形dp
    题意给定一个树,求经过\(k\)个不同点所需要的步骤。以及给出一个方案。题解赛时得分:5/100不知道赛时哪里写错了。能想到找出以1开始的直径,直径上的点是必定会走的......
  • [DPDK] 混杂模式
    [DPDK]混杂模式通常来讲,当一个网卡收到的包的目标MAC地址不是这个网卡的MAC地址时,网卡会无视这个包。如果想让网卡可以收到destMAC是任意地址的包,需要开启DPDK的混杂模......
  • 2000 Using Second-Order Power Analysis to Attack DPA Resistant Software
    一、高阶DPA攻击一个n阶DPA攻击利用能量迹中n个对应于不同中间值的点攻击背景:对随机掩码异或(B操作)后的明文或密文再进行白化(C操作),则一阶DPA攻击无法成功......
  • 堆、优先队列
    堆堆的定义堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象堆的特性:1.它是完全二叉树,除了树的最后一层结点不需要是满的,其他......
  • 3.两个栈实现一个队列
    两个栈实现一个队列方法一:时间复杂度:push O(1)pop O(n)peek O(n)查看队头元素empty O(1)方法二:pop和peek的时间复杂度为O(n)是因为访问了队头(都位......
  • 【lwip】11-UDP协议&源码分析
    目录前言11.1传输层说明11.2UDP协议简介11.3UDP特点11.4UDP端口号11.5UDP报文11.6UDP伪首部和校验和11.7wireshark报文分析11.8UDP数据结构11.8.1UDP首部11.9UDP......
  • tcp/udp 协议特性和三次握手
    一、TCP/UDP协议特性1)TCP特性:工作在传输层、建立连接、可靠的、错误检查2)UDP特性:工作在传输层、不需要连接、不可靠的、有限的错误检查、传输性能高  2、控制位及确......
  • 深度解析传输控制协议TCP和UDP
    传输协议的引入:如果两台计算机已经处于连接状态,那怎样让数据从一端传送到另外一端?(采用TCP和UDP协议) 一、TCP用户传输协议TCP协议是TransmissionControlProtocol传......