CodeForces - 1055B Alice and Hairdresser (思維)
阿新 • • 發佈:2018-12-01
題目大意:
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; }