题目链接: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. 洛谷疯狂coding~

    1.关于数学建模思想在coding之中的应用. 将马路作为一条数轴,每棵树的位置作为数轴上的坐标点,再将坐标点与数组的下标联系到一起,完成建模. 2.本题坑点在于对“其中有多少个数,恰好等于集合中另外 ...

  2. pandas的使用(6)离散化和合并

    pandas的使用(6)离散化和合并

  3. 我的周记10——“知行合一"

    印象中有个名人说过一句名言:与其游手好闲地学习,不如学习游手好闲 来自 玉伯 .  字是真的好看,有风格 现在已经是第十篇周记了,写着写着慢慢偏离了初衷,但庆幸的是坚持下来写.我相信在用心写好每篇周记 ...

  4. Linux(centOS6.5)安装RabbitMQ

    第一.下载erlang和rabbitmq-server的rpm: wget  http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.c ...

  5. Java中Deque特性及API

    美人如斯,文章如斯! 定义 双向队列:支持插入删除元素的线性集合 特性: 插入.删除.获取操作支持两种形式:快速失败和返回null或true/false 既具有FIFO特点又具有LIFO特点,即是队列 ...

  6. sql server: 数据库备份时出现-operating-system-error-5拒绝访问

    本文转自:https://blog.csdn.net/ibsfn/article/details/80770855 sql-server 数据库备份时出现-operating-system-error ...

  7. C# word格式转换为pdf

    引用 Microsoft.Office.Interop.Word 这个dll,可以在解决方案浏览器中搜索到并下载. 源码如下: public bool WordToPDF(string sourceP ...

  8. 1 js中常用的操作

    总结一些前端js常用的操作 常用日期操作:前端开发常用 JS 方法 js中array.list.map的遍历:js遍历集合(Array,Map,Set) js中对象的定义:js创建自定义对象的几种方式 ...

  9. vue中如果在页面中v-model的是字典,那么在定义字典的时候,需要明确定义键值为''或者[],否则给字典的键值赋值后页面不显示

    如题 在template模板中 {{}} {{form_temp.blOwnerMemberList}} #是字典的形式哦 {{}} 在return的属性中 form_temp: { blOwnerM ...

  10. Android源码分析(十七)----init.rc文件添加脚本代码

    一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...