讲课专用——线段树——BSS
题目链接: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的更多相关文章
- 讲题专用——线段树——优化DP
题目链接:http://codevs.cn/problem/3342/ 题解: 最小化最大值:二分 二分最长空题段 令f[i]表示抄第i道题所花费的最小时间 状态转移方程:f[i]=min(f[j]) ...
- BZOJ 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚( 线段树 )
线段树.. -------------------------------------------------------------------------------------- #includ ...
- 【BZOJ】1651: [Usaco2006 Feb]Stall Reservations 专用牛棚(线段树/前缀和 + 差分)
http://www.lydsy.com/JudgeOnline/problem.php?id=1651 很奇妙.. 我们发现,每一时刻的重叠数选最大的就是答案.... orz 那么我们可以线段树维护 ...
- 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队
看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- BZOJ 5168 && Luogu P3740 [HAOI2014]贴海报 线段树~~
据说某谷数据十分水...但幸好BZOJ上也过了...话说我记得讲课时讲的是奇奇怪怪的离散化..但现在突然觉得什么都可以线段树瞎搞了...QAQ 直接就是这个区间有没有被覆盖,被覆盖直接return: ...
- POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
看到讲课安排上 线段树有一节课"区间合并" 我是迷茫的 因为并没有见过 然后了解了一下题目 发现以前写过 还是很麻烦的树链剖分 大概是 解决带修改的区间查询"连续问题&q ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
随机推荐
- 互联网基础知识------OSI七层网络模型梗概
OSI七层模型 七层网络结构: 应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 一般也作五层 应用层.传输层.网络层.数据链路层.物理层(实体层) 引申问题:TCP/IP协议与http协议 ...
- 一、hexo+github搭建个人博客的过程记录
前提: 1.新建一个github仓库 2.安装配置Node.js 3.安装配置Git 前提 步骤1.新建一个github仓库 打开github网站,(注册)登录账号,新建一个仓库; 注:==仓库名称要 ...
- 【ELK】elasticsearch使用bulk 导入批量的数据集文件报错:Validation Failed: 1: no requests added
执行命令如下: curl -XPOST http://192.168.6.16:9200/my_new_index/user/_bulk?pretty --data-binary @/cjf/es/e ...
- 一个JS正则的字符串替换函数
直接上函数吧 不废话 function replacestring(oldstr,newstr,text) { var exp = new RegExp(oldstr,'g'); var c=tex ...
- STM32最小系统设计
STM32最小系统设计 概述 最近在在设计一块板子的时候发现在设计STM32电路这部分时,有些东西模棱两可.本着科学严谨的态度,本着对工作负责的态度(板子设计坏了都是money!),这里对STM32最 ...
- 针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 某公司...打印机...(笔试中遇到的题目)
针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 举个例子:某公司有一台特殊打印机,还可以使用一年,一年后可能换为另一种打印机,这两种打印机都特殊而贵. ...
- PHP中,json汉字编码
当用json与js或者其它客户端交互时,如果有中文,则会变成unicode.虽然能使用,但是影响观看.不好调试呀.从网上找到了几个方法 一,用下面这个函数,需要编码时,直接调用这个函数就成 funct ...
- 微服务架构 ------ 插曲 Mybatis逆向工程
1.首先是pom.xml, 我们需要引入需要的mvn插件 <?xml version="1.0" encoding="UTF-8"?> <pr ...
- English--倒装句
English|倒装句 这一块主要进行英语中倒装句与强调句的透析,希望大家可以掌握倒装句.因为倒装句,实在是太常见了,加油哦~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- vulnhub AI: Web: 1
vulnhub AI: Web: 1 提取flag攻略 导入虚拟机,开机. 扫描NAT的C段,确定虚拟机IP和开放端口. 尝试访问该网站 发现什么都没有,抽根烟冷静一下...... 来波目录扫描吧 使 ...