题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取)

思路:用线段树维护一个区间最值连续和。我们设出两个变量Lmin,Rmin,Mmin表示区间左边最小连续和,右边最小连续和,区间最小连续和,显然这可以通过这个方式更新维护。

现在我们已经可以维护一个区间最值连续和了,那么怎么求“环”的最小连续和呢?显然如果最小区间横跨1和n是不能表示出来的(比如最小区间是2,1,n,n-1之和),那么我们可以转化为求sum-Mmax即区间和减去区间最大值,那么显然最终答案是min( sum[1] - Mmax[1], Mmin[1] ),但由题意“不能全取也不能不取”,那么特判。

好久没做线段树维护连续区间的题了...

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x) x&-x;
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-;
const int maxn = 1e5+;
const ll mod = 1e8+;
ll Lmax[maxn << ], Rmax[maxn << ], Mmax[maxn << ], sum[maxn << ];
ll Lmin[maxn << ], Rmin[maxn << ], Mmin[maxn << ];
ll a[maxn];
void push_up(int rt){
Lmax[rt] = max(Lmax[rt << ], sum[rt << ] + Lmax[rt << | ]);
Rmax[rt] = max(Rmax[rt << | ], sum[rt << | ] + Rmax[rt << ]);
Mmax[rt] = max(max(Mmax[rt << ], Mmax[rt << | ]), Rmax[rt << ] + Lmax[rt << | ]);
Lmin[rt] = min(Lmin[rt << ], sum[rt << ] + Lmin[rt << | ]);
Rmin[rt] = min(Rmin[rt << | ], sum[rt << | ] + Rmin[rt << ]);
Mmin[rt] = min(min(Mmin[rt << ], Mmin[rt << | ]), Rmin[rt << ] + Lmin[rt << | ]);
sum[rt] = sum[rt << ] + sum[rt << | ];
}
void build(int l, int r, int rt){
if(l == r){
Mmax[rt] = Rmax[rt] = Lmax[rt] = Mmin[rt] = Rmin[rt] = Lmin[rt] = sum[rt] = a[l];
return;
}
int m = (l + r) >> ;
build(l, m, rt << );
build(m + , r, rt << | );
push_up(rt);
}
void update(int pos, int l, int r, int v, int rt){
if(l == r){
Mmax[rt] = Rmax[rt] = Lmax[rt] = Mmin[rt] = Rmin[rt] = Lmin[rt] = sum[rt] = v;
return;
}
int m = (l + r) >> ;
if(pos <= m)
update(pos, l, m, v, rt << );
else
update(pos, m + , r, v, rt << | );
push_up(rt);
}
int main(){
int n, m, A;
ll B;
while(~scanf("%d", &n)){
for(int i = ; i <= n; i++){
scanf("%lld", &a[i]);
}
build(, n, );
scanf("%d", &m);
while(m--){
ll MAX, MIN, ans;
scanf("%d%lld", &A, &B);
update(A, , n, B, );
if(Mmax[] == sum[]){
ans = Mmin[];
}
else if(Mmin[] == sum[]){
ans = Mmin[] - Mmax[];
}
else{
ans = min(sum[] - Mmax[], Mmin[]);
}
printf("%lld\n", ans);
}
}
return ;
}

FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解的更多相关文章

  1. SPOJ - GSS1-Can you answer these queries I 线段树维护区间连续和最大值

    SPOJ - GSS1:https://vjudge.net/problem/SPOJ-GSS1 参考:http://www.cnblogs.com/shanyr/p/5710152.html?utm ...

  2. Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)

    You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defi ...

  3. POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )

    POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...

  4. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

  5. 线段树维护区间前k小

    线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...

  6. CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)

    题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...

  7. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  8. 滑动窗口(poj,线段树维护区间最值)

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  9. hdu_5726_GCD(线段树维护区间+预处理)

    题目链接:hdu_5726_GCD 题意: 给你n个数(n<=1e5)然后m个询问(m<=1e5),每个询问一个区间,问你这个区间的GCD是多少,并且输出从1到n有多少个区间的GCD和这个 ...

随机推荐

  1. 关于CTeX的几个大坑

    https://blog.csdn.net/zjutczj/article/details/53463478 最近一直忙着写小论文,毕业设计中期答辩,没有更新博客,忙过这一阵我会把这段时间学习机器学习 ...

  2. 【2017-2-26】C#String类、Math类、DateTime类

    String类 黑色小扳手:属性      后面不带括号 紫色小箱子:方法      后面带小括号 1.字符串.Length;   字符串长度,返回int类型 字符串的长度 2.字符串.TrimSta ...

  3. Spark学习之路 (四)Spark的广播变量和累加器

    一.概述 在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本.这些变量会被复制到每台机器上 ...

  4. QDialog 使用Demo

    [1].pro QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = TestDialog TEMPLATE = ...

  5. mybatis源码解析3---XMLConfigBuilder解析

    1.XMLConfigBuilder XMLConfigBuilder类位于Mybatis包的org.apache.ibatis.builder.xml目录下,继承于BaseBuilder类,关于Ba ...

  6. 计蒜客---N的-2进制表示

    对于十进制整数N,试求其-2进制表示. 例如,因为  1*1  +  1*-2  +  1*4  +  0*-8  +1*16  +  1*-32  =  -13  ,所以(-13)_10  =  ( ...

  7. 费马小定理与GCD&LCM

    若 t = 1 ,  a ^ ( p - 2 ) 为 a 在取模 p 意义下的乘法逆元 通常用 inv 表示 证明: b * a =(三等)1(mod p) a ^ ( p - 2 ) * a =(三 ...

  8. ssh无秘钥登录

    服务器1:172.16.20.136 服务器2:172.16.20.134 在服务器2上输入:ssh-keygen -t rsa           (一路回车) scp /root/.ssh/id_ ...

  9. JavaScript 中禁止用户右键菜单,复制,选取,Ctrl,Alt,Shift. 获取宽高,清除浮动

    //禁用右键菜单 document.oncontextmenu = function(){ event.returnValue = false; } //禁用选取内容 document.onselec ...

  10. 使用隐含参数testMappingSpeed排查GoldenGate抽取慢的步骤

    OGG经典抽取模式读取redo慢的检查步骤,可以采用以下几个步骤来排查. 步骤一,确认是否抽取进程的写入有问题 1. 在原有抽取进程上,执行如下命令,统计抽取进程的效率 GGSCI> stats ...