天天看点

CF1406D(20-10-16)CF1406D

CF1406D

codeforce 1406D Three Sequences

思想

  • 考虑假如b[1]=x,c[1]=y
  • 如果a2>a1,那么b[2]=x+a2-a1,c[2]=y
  • 如果a2<a1,那么b[2]=x,c[2]=y+a2-a1
  • 以此类推,可以通过差分来解决,答案就是max(b[n],c[1]),所以要让这两个数尽可能相等

代码

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <functional>
#define INF 0x3f3f3f3f
#define N 100010
#define M 1010
#define ll long long
using namespace std;
ll n,m,c,a[N],x,l,r;
bool book[N];
int main()
{
	scanf("%lld",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    for(int i=n;i>1;i--)
    {
        a[i]-=a[i-1];
        if(a[i]>0) x+=a[i],book[i]=true;
    }
    printf("%lld\n",a[1]+x>0 ? (a[1]+x+1)/2 : (a[1]+x)/2);
    scanf("%lld",&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld",&l,&r,&c);
        if(book[l]) x-=a[l],book[l]=false;
        a[l]+=c;
        if(a[l]>0 && l>1) x+=a[l],book[l]=true;
        if(r!=n)
        {
            if(book[r+1]) x-=a[r+1],book[r+1]=false;
            a[r+1]-=c;
            if(a[r+1]>0) x+=a[r+1],book[r+1]=true;
        }
        printf("%lld\n",a[1]+x>0 ? (a[1]+x+1)/2 : (a[1]+x)/2);
    }
	return 0;
}
/*

*/
           

继续阅读