1. 程式人生 > >【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser

【Mail.Ru Cup 2018 Round 2 B】 Alice and Hairdresser

【連結】 我是連結,點我呀:)
【題意】

【題解】


因為只會增加。
所以。
一開始暴力算出來初始答案
每次改變一個點的話。
就只需要看看和他相鄰的數字的值就好。
看看他們是不是大於l
分情況增加、減少答案就好

【程式碼】

#include <bits/stdc++.h>
#define LL long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
using namespace std;

const int N = 1e5;

int n,m,l;
int ans;
LL a[N+10];

int main(){
    scanf("%d%d%d",&n,&m,&l);
    rep1(i,1,n) scanf("%lld",&a[i]);
    rep1(i,1,n)
        if(a[i]>l){
            int j = i;
            while (j+1<=n && a[j+1]>l) j++;
            ans++;
            i = j;
        }
    rep1(i,1,m){
        int ope;
        scanf("%d",&ope);
        if (ope==0){
            printf("%d\n",ans);
        }else{
            int pos,delta;
            scanf("%d%d",&pos,&delta);
            if (a[pos]<=l && a[pos]+delta>l){
                int ll,rr;
                if (a[pos-1]>l) ll = 1;else ll = 0;
                if (a[pos+1]>l) rr = 1;else rr = 0;
                if (ll>0 && rr>0){
                    ans--;
                }else{
                    if (ll==0 && rr==0){
                        ans++;
                    }else{

                    }
                }
            }
            a[pos]+=delta;
        }
    }
    return 0;
}