CF1055B 题解

CF1055B 题解

思路

其实就是一道用数组做的模拟题。

就用一个数组 a 记录第 i 根头发的长度,一个变量 ans 来记录目前捡的话要几秒钟,接下来就是要输入 a 数组,那其实也很简单,ans 就动态更新,如果前面一根头发不需要剪,而这根头发大于 l,则 ans++,因为其实将 ans 转化一下就是求 a 数组中有几个连续区间使得区间内的所有数都大于 l,所以要是 ai>l 并且 ai1l,则会多出一个区间。

然后初始化完了就要开始进行 m 次操作:

  1. 要是第一个数为 0,则直接输出 ans
  2. 要是第一个数是 1,就要开始操作了:

首先,ap=ap+d,然后就要开始更新 ans,分为以下两种情况:

  1. 要是更新完的 ap 大于 l,并且 ap1l,ap+1l,则 ap 为一个新的区间,因此 ans++
  2. 要是更新完的 ap 大于 l,并且 ap1>l,ap+1>l,则 ap 让前面和后面的区间连在了一起(两个区间合二为一),因此 ans--

注意:上面两种情况都是原本的 ap 小于等于 l

总结

  1. 模拟。
  2. 数组基础。
  3. 分类讨论。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,l,ans,a[100005],x,p,d;
int main(){
	scanf("%lld %lld %lld",&n,&m,&l);
	for(int i=1; i<=n; i++){
		scanf("%lld",&a[i]);
		if(a[i-1]<=l&&a[i]>l) ans++;//a[i]要剪,且a[i-1]不需要剪,则a[i]多创造出来了一个区间。 
	}
	while(m--){//m次操作。 
		scanf("%lld",&x);
		if(x==0) printf("%lld\n",ans);//直接输出答案,头发全都剪完了。 
		else{//某根头发又神经质的长长了。 
			scanf("%lld %lld",&p,&d);
			a[p]+=d;//更新。 
			if(a[p]-d<=l){//原本是不需要剪的才可以,因为它如果原本就已经要剪的话它不管怎么长都是要剪的,而且那样ans不用变。 
				if(a[p]>l&&a[p-1]<=l&&a[p+1]<=l) ans++;//前后都是不需要剪的,所以这根头发创建了一个新区间。 
				if(a[p-1]>l&&a[p]>l&&a[p+1]>l) ans--;//前后都是要剪的,而因为原本a[p]不需要减,不属于前后两个区间,而现在,它不仅属于两个区间了,还把两个区间连起来了,所以区间数减少1。 
			}
		}
	}
	return 0;
}
posted @   naroto2022  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
花开如火,也如寂寞。