题目大意:
Alice去剪发,一共有n根头发,长度大于l的头发需要剪,如果一个区间中的头发长度全部大于l,那么可以一次给这个区间的所有头发都剪,
输入给出0是询问需要剪几次。
给出1是第p根头发长了d长度
题解:
首先总计一下给出的数据需要剪的区间有几个,也就是需要剪的总次数是多少。
当给第p根头发增长了d后,以前小于l,增长之后大于l的话
如果左右两边都大于l,那么现在第p根也大于l了,就可以和左右两边连成片,一次减掉,所以要剪的总次数减一。
如果左右两边都小于等于l,那么第p根现在需要剪了,就要剪的总次数加一。
其他情况都不影响剪的总次数。
#include<bits/stdc++.h>
#include<cstring>
#define ll long long
#define INF 1000000000
using namespace std;
ll a[100010];
int main()
{
//freopen("input.txt","r",stdin);
int n,m,l;
scanf("%d%d%d",&n,&m,&l);
for(int i=1;i<=n;++i)
scanf("%I64d",&a[i]);
int i=1;
ll num=0;
while(i<=n)
{
if(a[i]>l)
{
num++;
while(a[i]>l && i<=n)
i++;
}
++i;
}
int x,p,d;
while(m--)
{
scanf("%d",&x);
if(x==0)
printf("%I64d\n",num);
else
{
scanf("%d%d",&p,&d);
if(a[p]+d>l && a[p]<=l)
{
if(a[p-1]>l && a[p+1]>l)
num--;
if(a[p-1]<=l && a[p+1]<=l)
num++;
}
a[p]+=d;
}
}
return 0;
}