题目链接

题目大意

给你一个长为n的数组a,要你构造一个非严格单调上升的数组b和一个非严格单调下降的数组c,使得\(b_i+c_i=a_i\) 要你使这两个数组b,c中最大的元素最小,还有q次修改(q<=1e5),每次修改使[l,r]上的所有元素加x。在线查询

题目思路

看到这个区间操作,在线查询,就能想到线段树qwq,结果居然是差分

假设现在已经确定了\(b[1]\)\(c[1]\)。

假设\(a[2]\)大于\(a[1]\)而\(b[2]+c[2]=a[2]\)

显然是想要b数组的每一个元素尽可能小,而c数组是非严格单调上升那么\(c[2]=c[1]\),则\(b[2]=b[2]+(a[2]-a[1])\)

同理可以得出结论

当\(a[i]>a[i-1]\)

\(b[i]=b[i-1]+(a[i]-a[i-1])\;\;c[i]=c[i-1]\)

当\(a[i]<a[i-1]\)

\(b[i]=b[i-1]\;\;c[i]=c[i-1]+(a[i]-a[i-1])\)

而\(ans=\max(b[1],c[n])\)

\(b[1]+c[1]=a[1]\)

\(b[n]=b[1]+s=\sum_{i=2}^{i=n}\max(a[i]-a[i-1],0)\)

上述两式可以推出

\(b[n]+c[1]=a[1]+s\)

则要使得ans最小,则要使得b[n]和c[1]尽可能相近,\(ans=(a[1]+2)/2\)

易错:注意负数/2,c语言中/2是向0靠近

代码

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e5+5,inf=0x3f3f3f3f;
const double eps=1e-10;
int n,q;
ll a[maxn],b[maxn],res;
ll cal(){
ll ans=res+b[1];
if(ans>0){
return (ans+1)/2;
}else{
return ans/2;
}
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
b[i]=a[i]-a[i-1];
if(i!=1&&b[i]>0){
res+=b[i];
}
}
printf("%lld\n",cal());
scanf("%d",&q);
for(int i=1,l,r,x;i<=q;i++){
scanf("%d%d%d",&l,&r,&x);
if(l!=1){
res=res-max(0ll,b[l])+max(0ll,b[l]+x);
}
b[l]+=x;
if(r!=n){
res=res-max(0ll,b[r+1])+max(0ll,b[r+1]-x);
}
b[r+1]-=x;
printf("%lld\n",cal());
}
return 0;
}

Codeforces Round #670 (Div. 2) D. Three Sequences 题解(差分+思维+构造)的更多相关文章

  1. 数学 Codeforces Round #219 (Div. 2) B. Making Sequences is Fun

    题目传送门 /* 数学:这题一直WA在13组上,看了数据才知道是计算cost时超long long了 另外不足一个区间的直接计算个数就可以了 */ #include <cstdio> #i ...

  2. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  3. Codeforces Round #556 (Div. 2) - C. Prefix Sum Primes(思维)

    Problem  Codeforces Round #556 (Div. 2) - D. Three Religions Time Limit: 1000 mSec Problem Descripti ...

  4. Codeforces Round #219 (Div. 2) B. Making Sequences is Fun

    B. Making Sequences is Fun time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  5. Codeforces Round #162 (Div. 1) B. Good Sequences (dp+分解素数)

    题目:http://codeforces.com/problemset/problem/264/B 题意:给你一个递增序列,然后找出满足两点要求的最长子序列 第一点是a[i]>a[i-1] 第二 ...

  6. Codeforces Round #450 (Div. 2) D.Unusual Sequences (数学)

    题目链接: http://codeforces.com/contest/900/problem/D 题意: 给你 \(x\) 和 \(y\),让你求同时满足这两个条件的序列的个数: \(a_1, a_ ...

  7. Codeforces Round #670 (Div. 2) 深夜掉分(A - C题补题)

    1406A. Subset Mex https://codeforces.com/contest/1406/problem/A Example input 4 6 0 2 1 5 0 1 3 0 1 ...

  8. Divide by Zero 2021 and Codeforces Round #714 (Div. 2) B. AND Sequences思维,位运算 难度1400

    题目链接: Problem - B - Codeforces 题目 Example input 4 3 1 1 1 5 1 2 3 4 5 5 0 2 0 3 0 4 1 3 5 1 output 6 ...

  9. Codeforces Round #670 (Div. 2) C. Link Cut Centroids (dfs,树)

    C. Link Cut Centroids Fishing Prince loves trees, and he especially loves trees with only one centro ...

随机推荐

  1. vue-cli中使用全局less变量

    1.执行 vue add style-resources-loader 命令,选择less 2.在 vue.config.js中添加配置,注意将路径更改为自己存放less变量文件的地址 // 全局使用 ...

  2. 云计算管理平台之OpenStack计算服务nova

    一.nova简介 nova是openstack中的计算服务,其主要作用是帮助我们在计算节点上管理虚拟机的核心服务:这里的计算节点就是指用于提供运行虚拟机实例的主机,通常像这种计算节点有很多台,那么虚拟 ...

  3. java多线程实现TCP网络Socket编程(C/S通信)

    目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...

  4. StrongArray

    * System类中包含了一个static void arraycopy(object src,int srcops,object dest ,int destpos, int length )方法, ...

  5. Java_Stringbuilder和StringBuffer

    StringBuilder和StringBuffer非常类似, 均代表可变的字符串序列. 这两个类都是抽线类AbstractStringBuilder的子类, 方法几乎一样 /******String ...

  6. js 操作css

    类似于jquery的css()函数,js封装 CSS函数:css(oDiv , "width" , "200px ")设置样式css(oDiv , " ...

  7. IOC容器小结

    IOC容器: Ioc-Inversion of Control,即"控制反转",就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化.定位.配置应用程序中的对象及 ...

  8. 剑指29:最小的k个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. class Solution {public:    vector& ...

  9. python3批量修改文件后缀名

    import os # 原文件后缀名 suffix_name = '.jar.src.zip' # 新文件后缀名 nwe_suffix_name = '.jar' def foo(path1): fi ...

  10. Linux下端口被占用,关掉端口占用的方法

    Linux下端口被占用(例如端口3000),关掉端口占用的进程的方法: 1.netstat -tln | grep 3000 2.sudo lsof -i:3000 3.sudo kill -9 进程