CF1406D(20-10-16)

这篇博客介绍了如何运用差分方法解决Codeforce1406D题目,通过分析序列变化规律,得出动态更新策略,并给出C++实现代码。文章重点讨论了在序列更新过程中如何保持两个子序列的最大值平衡,从而得出最终解答。
摘要由CSDN通过智能技术生成

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

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值