前言

其实我觉得你看猫锟的解释也看不懂(主要是还有一些不良心的讲解者不讲清楚,当然这里不是针对了qwq)
猫锟链接

Solution

考虑我们的线段树是个啥玩意?
每一层都是一堆区间叠在一起。
我们在每一个节点维护的又是什么?
左边的max,右边的max,中间的max,还有sum。
那么我们改变一下:
令\(p_{dps,i}\)表示在深度为\(dps\)的线段树上\(i\)这个节点所在区间的左边的max,右边的max,然后就可以在\(build\)的时候求

再令\(p_{dps,i}\)表示在深度为\(dps\)的线段树上\(i\)这个节点所在区间的到中间的\(max\),然后也可以在\(build\)的时候求。

然后就可以\(\Theta(1)\)的询问就好了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
inline int gi()
{
    int f=1,sum=0;char ch=getchar();
    while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
    return f*sum;
}
const int N=500010;
int pos[N],p[21][N],s[21][N],a[N],Log2[N<<3],n;
void build(int o,int l,int r,int dps)
{
    if(l==r)
    {
        pos[l]=o;
        return;
    }
    int mid=(l+r)>>1,pre,sm;
    p[dps][mid]=s[dps][mid]=sm=pre=a[mid];
    if(sm<0)sm=0;
    for(int i=mid-1;i>=l;i--)
    {
        sm+=a[i];pre+=a[i];
        s[dps][i]=max(s[dps][i+1],pre);
        p[dps][i]=max(p[dps][i+1],sm);
        if(sm<0)sm=0;
    }
    p[dps][mid+1]=s[dps][mid+1]=sm=pre=a[mid+1];
    if(sm<0)sm=0;
    for(int i=mid+2;i<=r;i++)
    {
        sm+=a[i];pre+=a[i];
        s[dps][i]=max(s[dps][i-1],pre);
        p[dps][i]=max(p[dps][i-1],sm);
        if(sm<0)sm=0;
    }
    build(o<<1,l,mid,dps+1);
    build(o<<1|1,mid+1,r,dps+1);
}
int query(int l,int r)
{
    if(l==r)return a[l];
    int dps=Log2[pos[l]]-Log2[pos[l]^pos[r]];
    return max(max(p[dps][l],p[dps][r]),s[dps][l]+s[dps][r]);
}
int main()
{
    n=gi();
    for(int i=1;i<=n;i++)a[i]=gi();
    int L=2;
    while(L<n)L<<=1;
    for(int i=2;i<=L<<1;i++)Log2[i]=Log2[i>>1]+1;
    build(1,1,L,1);
    int m=gi();
    while(m--)
    {
        int l=gi(),r=gi();
        printf("%d\n",query(l,r));
    }
    return 0;
}

另一个画风的GSS1 - Can you answer these queries I(猫树)的更多相关文章

  1. SPOJ GSS1 - Can you answer these queries I(线段树维护GSS)

    Can you answer these queries I SPOJ - GSS1 You are given a sequence A[1], A[2], -, A[N] . ( |A[i]| ≤ ...

  2. SPOJ GSS1 Can you answer these queries I[线段树]

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

  3. SPOJ GSS1 Can you answer these queries I ——线段树

    [题目分析] 线段树裸题. 注意update的操作,写结构体里好方便. 嗯,没了. [代码] #include <cstdio> #include <cstring> #inc ...

  4. SP1043 GSS1 - Can you answer these queries I 线段树

    问题描述 LG-SP1043 题解 GSS 系列第一题. \(q\) 个询问,求 \([x,y]\) 的最大字段和. 线段树,维护 \([x,y]\) 的 \(lmax,rmax,sum,val\) ...

  5. 线段树 SP1043 GSS1 - Can you answer these queries I

    SP1043 GSS1 - Can you answer these queries I 题目描述 给出了序列A[1],A[2],-,A[N]. (a[i]≤15007,1≤N≤50000).查询定义 ...

  6. [题解] SPOJ GSS1 - Can you answer these queries I

    [题解] SPOJ GSS1 - Can you answer these queries I · 题目大意 要求维护一段长度为 \(n\) 的静态序列的区间最大子段和. 有 \(m\) 次询问,每次 ...

  7. SPOJ GSS1_Can you answer these queries I(线段树区间合并)

    SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...

  8. SP1043 GSS1 - Can you answer these queries I(猫树)

    给出了序列A[1],A[2],…,A[N]. (a[i]≤15007,1≤N≤50000).查询定义如下: 查询(x,y)=max{a[i]+a[i+1]+...+a[j]:x≤i≤j≤y}. 给定M ...

  9. 题解【SP1043】 GSS1 - Can you answer these queries I

    题目描述 You are given a sequence \(A_1, A_2, ..., A_n(|A_i|≤15007,1≤N≤50000)\). A query is defined as f ...

随机推荐

  1. 源码阅读经验谈-slim,darknet,labelimg,caffe(1)

    本文首先谈自己的源码阅读体验,然后给几个案例解读,选的例子都是比较简单.重在说明我琢磨的点线面源码阅读方法.我不是专业架构师,是从一个深度学习算法工程师的角度来谈的,不专业的地方请大家轻拍. 经常看别 ...

  2. thymeleaf注入springboot

    thymeleaf注入springboot需要引入jar: <dependency> <groupId>org.springframework.boot</groupId ...

  3. Data Persistence

    [Data Persistence] 1.构建环境. cd /home/ubuntu/contracts mkdir addressbook cd addressbook touch addressb ...

  4. 外网访问Vmware虚拟机中的某个服务(如http)

    如果主机是windowx NAT中隐藏的端口映射,说明一下环境,利用当然是VMnet8网络连接,在虚拟机中架设linux WEB服务器利用WEB默认80端口,IP为192.168.11.10,真实主机 ...

  5. Mysql连接数太多ERROR 1040 (HY000): Too many connections

    数据库连接报错:ERROR 1040 (HY000): Too many connections   1.查看连接数 /usr/local/mysql/bin/mysqladmin -h host - ...

  6. android 个人使用总结

    android 中button控件去除阴影背景 style="?android:attr/borderlessButtonStyle" android  中输入账号和密码是做判断处 ...

  7. compatible

    compatible 英 [kəmˈpætəbl] 美 [kəmˈpætəbəl] adj. 兼容的,相容的; 和谐的,协调的; [生物学] 亲和的; 可以并存的,能共处的;

  8. 搭建React项目(一):在网页中使用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. HTML中的Meta标签详解

    emta标签的组成:meta标签分两大部分:HTTP-EQUIV和NAME变量. HTTP-EQUIV:HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显 ...

  10. yum提示Another app is currently holding the yum lock

    使用yum grouplis列举系统中以组安装的包,结果提示: # yum grouplist Loaded plugins: fastestmirror, refresh-packagekit, s ...