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