题目链接:http://codevs.cn/problem/3981/

题解:

线段树求GSS模板题

一、一段长的区间的 GSS 有三种情况:
>1 完全在左子区间
>2 完全在右子区间
>3 横跨左右区间

二、需维护的信息:

mx 区间GSS  ——用来更新情况1、2

lmx 区间最大前缀——用来更新情况3

rmx 区间最大后缀——用来更新情况3

sum 区间和——lmx,rmx

三、建树

1、初始化:区间需维护的信息最初都赋为输入值

2、合并区间信息

mx:3种情况中的最大值

lmx:左区间的lmx, 左区间的sum+右区间lmx  取大

rmx 同理

四、查询

情况1、2很简单

情况3的合并与上面的合并区间信息同理

#include<cstdio>
#include<algorithm>
#include<iostream> using namespace std; #define N 200000
#define inf -1e18
typedef long long LL; int n,m;
int L,R; struct node
{
LL lmx,rmx,mx,sum;
void clear()
{
lmx=rmx=sum=mx=inf;
} }tree[N*+]; template <typename T>
void read(T &x) //读入优化
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void out(LL ans) //输出优化
{
if(ans<) { putchar('-'); ans=-ans; }
char s[]; int len=;
do s[++len]=ans%+''; while(ans/=);
while(len) putchar(s[len--]); putchar('\n');
} void up(int k) //线段树上区间信息合并
{
int l=k<<,r=k<<|;
tree[k].mx=max(tree[l].mx,tree[r].mx);
tree[k].mx=max(tree[k].mx,tree[l].rmx+tree[r].lmx);
tree[k].lmx=max(tree[l].lmx,tree[l].sum+tree[r].lmx);
tree[k].rmx=max(tree[r].rmx,tree[r].sum+tree[l].rmx);
tree[k].sum=tree[l].sum+tree[r].sum;
} void build(int k,int l,int r) //建树
{
if(l==r)
{
read(tree[k].mx);
tree[k].lmx=tree[k].rmx=tree[k].sum=tree[k].mx;
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
up(k);
} node query(int k,int l,int r) // 查询
{
if(l>=L&&r<=R) return tree[k];
int mid=l+r>>;
if(R<=mid) return query(k<<,l,mid); //查询区间完全在左子区间
if(L>mid) return query(k<<|,mid+,r); //查询区间完全在右子区间
//查询区间跨左右区间
node lans; lans.clear();
lans=query(k<<,l,mid);
node rans; rans.clear();
rans=query(k<<|,mid+,r);
node ans;
ans.clear();
ans.mx=max(lans.mx,rans.mx); //GSS完全在左或右区间
ans.mx=max(lans.rmx+rans.lmx,ans.mx); //GSS跨左右区间
ans.lmx=max(lans.lmx,lans.sum+rans.lmx);
ans.rmx=max(rans.rmx,rans.sum+lans.rmx);
ans.sum=lans.sum+rans.sum;
return ans;
} void init()
{
read(n);
build(,,n);
read(m);
LL ans;
for(int i=;i<=m;++i)
{
read(L); read(R);
ans=query(,,n).mx;
out(ans);
}
} int main()
{
init();
return ;
}

讲课专用——线段树——BSS的更多相关文章

  1. 讲题专用——线段树——优化DP

    题目链接:http://codevs.cn/problem/3342/ 题解: 最小化最大值:二分 二分最长空题段 令f[i]表示抄第i道题所花费的最小时间 状态转移方程:f[i]=min(f[j]) ...

  2. BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚( 线段树 )

    线段树.. -------------------------------------------------------------------------------------- #includ ...

  3. 【BZOJ】1651: [Usaco2006 Feb]Stall Reservations 专用牛棚(线段树/前缀和 + 差分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1651 很奇妙.. 我们发现,每一时刻的重叠数选最大的就是答案.... orz 那么我们可以线段树维护 ...

  4. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

  5. BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )

    O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...

  6. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. BZOJ 5168 && Luogu P3740 [HAOI2014]贴海报 线段树~~

    据说某谷数据十分水...但幸好BZOJ上也过了...话说我记得讲课时讲的是奇奇怪怪的离散化..但现在突然觉得什么都可以线段树瞎搞了...QAQ 直接就是这个区间有没有被覆盖,被覆盖直接return: ...

  8. POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并

    看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...

  9. Dynamic Rankings(树状数组套权值线段树)

    Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...

随机推荐

  1. Ansible17:Playbook之tags

    目录 简介 为task打tag 使用tag 执行指定tag的task 排除指定tag的task 查看playbook中的所有tag 打tag的几种方式 ansible内置tag 简介 在大型项目当中, ...

  2. 机器学习之Artificial Neural Networks

    人类通过模仿自然界中的生物,已经发明了很多东西,比如飞机,就是模仿鸟翼,但最终,这些东西会和原来的东西有些许差异,artificial neural networks (ANNs)就是模仿动物大脑的神 ...

  3. 喜大普奔,又拍云全新产品 WebSocket 上线啦

    作为一款现象级 MMORPG,魔兽世界迎来了自己的 9.0 版本.巧的是,又拍云最近也更新发布了一款产品--WebSocket.你可能会说,两者有个 mao 关系,不着急.我们先来聊聊魔兽世界~ 熟悉 ...

  4. 三、hexo+github搭建个人博客的主题配置

    更换博客主题 主题可参考:https://hexo.io/themes/ hexo默认主题:Landscape 示例主题:Next 下载Next主题 进入Blog所在目录,输入下载命令 #进入Blog ...

  5. Python 学习 第14篇:数据类型(元组和集合)

    元组和集合是Python中的基本类型 一,元组 元组(tuple)由小括号.逗号和数据对象构成的集合,各个项通过逗号隔开,元组的特点是: 元组项可以是任何数据类型,也可以嵌套 元组是一个位置有序的对象 ...

  6. Redis(序)应用场景

    前言 在阅读了<大型网站技术架构:核心原理与案例分析>书后,稍微了解了Redis在大型网站架构中的应用场景和目的. 大型网站都是从小用户量,小流量的网站演变过来的,在小型网站的架构之初,L ...

  7. idea2019注册码

    都9012年了,怎么还能忍受用低版本的编辑器呢, IntelliJ IDEA 2019破解教程拿走不谢 下载工具 Mac版idea下载链接: 链接:https://pan.baidu.com/s/1m ...

  8. linux命令之——grep详解

    grep命令用于查找文件里符合条件的字符串:也可以用于查找内容包含指定的范本样式的文件.它能使用正则表达式搜索,用于在文件中搜索指定的字符串模式,列出含有匹配模式子符串的文件名,并输出含有该字符串的文 ...

  9. Linux安装node环境

    一.进行连接远程: 1.命令窗口 —> 输入 ssh 用户名@主机IP —> 回车 2.输入密码 (输入后回车) 3.进入根目录 (命令:cd / ) 二.Linux环境安装node: T ...

  10. i春秋——“百度杯”CTF比赛 十月场——GetFlag(md5碰撞、文件包含、网站绝对路径)

    需要提交的captcha满足等式,肯定就是MD5碰撞了 附上脚本 import hashlib def func(md5_val): for x in range(1,100000000): md5_ ...