讲课专用——线段树——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[ ...
随机推荐
- Docker私有云管理平台————Docker Shipyard
一.shipyard中文版安装(CentOS) 注:本文安装操作均在root用户下,安装前需先安装Docker (传送门) 下载所需docker镜像 docker pull rethinkdb doc ...
- HTML5 下拉控件绑定数据
<select id="CommunityList" class="form-control" > <option>請選擇社團</ ...
- jquery-ajax请求.NET MVC 后台
在ajax的URL中写上"/你的控制器名/你方法名" 在后台控制器中对应有两个常用类型一个是ActionResult还有一个是JsonResult 在访问时需要在类型上加上publ ...
- EF启程--概念理解(数据库连接)
简介:Entity Framework 是一种支持 .NET 开发人员使用 .NET 对象处理数据库的对象关系映射程序 (O/RM). 它不要求提供开发人员通常需要编写的大部分数据访问代码. 其中有E ...
- ImageUtility辅助类
public class ImageUtility { #region 合并用户QR图片和用户头像 /// <summary> /// 合并用户QR图片和用户头像 /// </sum ...
- JAVA I/O系统 Thinking in Java 之 File类
File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此.它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称.如果它指的是一个文件集,我们就可以对此集合调用list ...
- 电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程)
电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...
- Git的下载安装
下载地址:https://git-scm.com/download/win 命令: git add ... ---将资源放到缓存区域 git commit -m "提交说明" ...
- atlas笔记
目录 环境 Mysql+Atlas配置 atlas:mysql-proxy扩展,mysql中间件,可以实现分表.分库(sharding版本).读写分离.数据库连接池等功能! Atlas类似于Twemp ...
- Python:日常应用汇总
判断路径中是否包含中文 import re def IsContainChinese(path:str) -> bool : cnPatter=re.compile(u'[\u4e00-\u9f ...