1. 程式人生 > >CodeForces - 1055B Alice and Hairdresser (思維)

CodeForces - 1055B Alice and Hairdresser (思維)

題目大意:

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