CodeForces - 1055B Alice and Hairdresser (思维)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxxjxw/article/details/83990002

题目大意:

       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;
}

猜你喜欢

转载自blog.csdn.net/hxxjxw/article/details/83990002
今日推荐