1. 程式人生 > 實用技巧 >CF1406D Three Sequences(思維)

CF1406D Three Sequences(思維)

我們發現由於b不減,c不增,所以如果ai>ai-1,那麼就是b增加,不然就是c減少。因此最大值的答案就是max(b1+k,c1),k是兩兩之間大於0的差值。

我們發現兩個答案越接近答案越小,因此最後的答案就是(a1+k)/2上取整。而對於修改操作直接在差分陣列上計算貢獻即可,注意邊界條件

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N],b[N],c[N];
ll s[N];
ll half(ll x){
    if(x>=0) return
x/2; else if(x%2==0) return x/2; else return x/2-1; } int main(){ int i; int n; cin>>n; for(i=1;i<=n;i++){ cin>>a[i]; } for(i=1;i<=n;i++){ s[i]=a[i]-a[i-1]; } ll sum=a[1]; for(i=2;i<=n;i++){ sum+=max(0ll,s[i]); } cout
<<half(sum+1)<<endl; int q; cin>>q; while(q--){ int l,r,k; cin>>l>>r>>k; if(l!=1) sum-=max(s[l],0ll),s[l]+=k,sum+=max(s[l],0ll); else sum-=s[l],s[l]+=k,sum+=s[l]; if(r!=n) sum-=max(s[r+1],0ll),s[r+1]-=k,sum+=max(s[r+1
],0ll); cout<<half(sum+1)<<endl; } }
View Code