首页 > 其他分享 >题解 洛谷 P3594 [POI2015] WIL

题解 洛谷 P3594 [POI2015] WIL

时间:2022-12-11 21:14:31浏览次数:73  
标签:le 洛谷 int 题解 sum WIL 区间 ll 指针

1. 题面描述

题目链接

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

\(1\le d\le n\le 2\times10^6,0\le p\le10^{16},1\le w_i\le10^9\),其中 \(w_i\) 表示第 \(i\) 个数的值。

2. 分析

如果没有修改操作,本题就是一个经典的双指针问题。

考虑修改。观察到序列中所有数均为正数,发现删除一个数一定不会让答案变得更劣,所以我们删除的区间的长度一定为 \(d\)。

那么对于一个区间 \([l,r]\),发现我们删除的区间一定是区间 \([l,r]\) 中和最大的一个,这样会有更多的机会来扩展区间。

于是我们维护双指针 \(l,r\) 的同时维护区间 \([l,r]\) 中和最大的长为 \(d\) 的区间的和是多少,就可以通过上述值移动指针。

3. 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+5;

int n,p,d,head=1,tail=0;
int a[N];
ll sum[N],que[N];

inline ll val(int x) {return sum[x]-sum[x-d];}

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>p>>d;
	for (int i=1; i<=n; i++) cin>>a[i], sum[i]=sum[i-1]+a[i];
	int ans=d;
	ll s=val(d);
	que[++tail]=d;
	for (int l=1,r=l+d; r<=n; r++) {
		while (head<=tail && val(que[tail])<=val(r)) tail--;
		que[++tail]=r; s+=a[r];
		while (l<=r && s-val(que[head])>p) {
			s-=a[l]; l++;
			while (head<=tail && que[head]-d+1<l) head++;
		}
		ans=max(ans,r-l+1);
	}
	cout<<ans<<'\n';
	return 0;
}

本文完。

标签:le,洛谷,int,题解,sum,WIL,区间,ll,指针
From: https://www.cnblogs.com/XeRnHe/p/Solution-Luogu-P3594.html

相关文章

  • 题解 CodeForces 940E Cashback
    1.题面描述题目链接给定长为\(n\)的序列和一个整数\(c\),你需要将其分为若干段。对于每一段,若其长度为\(k\),则可以删除其中前\(\lfloor\frac{k}{c}\rfloor\)小的......
  • 题解 洛谷 P3793 由乃救爷爷
    1.题面描述题目链接给定长为\(n\)的序列,\(m\)次询问,查询区间最大值。\(n,m\le10^7\),数据随机。2.分析经典的静态区间最小值问题,经典题目配经典算法,考虑到ST表......
  • NOIP2022 题解
    A.种花枚举\((x_2,y_0)\),考虑\(x_1\)可能在哪些位置,显然是在\(x_2\)往上的一个极长连续0段上。考虑如果固定了\(x_1\)的位置后怎么计算C形的数量,我们预处理......
  • CF1182E 题解
    前言题目传送门!更好的阅读体验?\(\text{zltqwq}\)推荐矩阵快速幂题目。思路......
  • P4902 乘积 题解
    乘积给出\(A\),\(B\),求下面的式子的值.\[\prod_{i=A}^{B}\prod_{j=1}^{i}(\frac{i}{j})^{\left\lfloor\frac{i}{j}\right\rfloor}\(\bmod\19260817)\]包含\(T\)组......
  • 【题解】CF1764C Doremy's City Construction
    题目传送门思路首先我们思考一个性质,由于不能有连续单调不升/不降的三个点连在一起,所以对于单个点来讲,显然要么只和比它大的连边(称为A类点),要么只和比它小的连边(称为B类点......
  • SP8547 题解
    SP8547题解题意简述:给定\(n\),找到能够使得辗转相除法执行\(n\)次的两个数,使得这两个数的和最小,输出这两个数。\(n\le10^{18}\)分析:对于这种题,一看就是猜结论的题,因......
  • [NOIP2022] 喵了个喵 题解
    [NOIP2022]喵了个喵题解先考虑\(k=2n-2\),这个数字提示我们每个栈放两种颜色,剩下一个栈辅助操作。那么颜色被分为两类在栈底,可以通过操作2消去。在栈顶,可以通过操作1......
  • VUE3 API之reactive和ref常见问题解决
    reactive解构最深的一层,失去响应性问题<scriptsetuplang="ts">lettarget={a:{b:1}};lettarget1={c:1};constobj=reactive(target)constobj1=......
  • MySQL8.0登录提示caching_sha2_password问题解决方法
    背景用​​docker​​构建mysql容器后连接遇到以下问题问题Authenticationplugin'caching_sha2_password'cannotbeloaded:dlopen(/usr/local/mysql/lib/plugin/cachin......