给出了序列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个查询,程序必须输出这些查询的结果。

这就是一个最大子段和,用线段树就能直接搞掉

然后这里学习了一下一个叫做猫树的神奇东西->这里

能做到预处理之后查询$O(1)$

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 using namespace std;
 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 6 char buf[1<<21],*p1=buf,*p2=buf;
 7 int read(){
 8     #define num ch-'0'
 9     char ch;bool flag=0;int res;
10     while(!isdigit(ch=getc()))
11     (ch=='-')&&(flag=true);
12     for(res=num;isdigit(ch=getc());res=res*10+num);
13     (flag)&&(res=-res);
14     #undef num
15     return res;
16 }
17 char sr[1<<21],z[20];int C=-1,Z;
18 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
19 void print(int x){
20     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
21     while(z[++Z]=x%10+48,x/=10);
22     while(sr[++C]=z[Z],--Z);sr[++C]='\n';
23 }
24 const int N=5e+5;
25 int n,m,a[N],len,log[N],pos[N],p[21][N],s[21][N];
26 void build(int pp,int l,int r,int d){
27     if(l==r) return (void)(pos[l]=pp);
28     int mid=(l+r)>>1,prep,sm;
29     p[d][mid]=s[d][mid]=sm=prep=a[mid];
30     if(sm<0) sm=0;
31     for(int i=mid-1;i>=l;--i){
32         prep+=a[i],sm+=a[i];
33         s[d][i]=max(s[d][i+1],prep),
34         p[d][i]=max(p[d][i+1],sm);
35         if(sm<0) sm=0;
36     }
37     p[d][mid+1]=s[d][mid+1]=sm=prep=a[mid+1];
38     if(sm<0) sm=0;
39     for(int i=mid+2;i<=r;++i){
40         prep+=a[i],sm+=a[i];
41         s[d][i]=max(s[d][i-1],prep),
42         p[d][i]=max(p[d][i-1],sm);
43         if(sm<0) sm=0;
44     }
45     build(pp<<1,l,mid,d+1);
46     build(pp<<1|1,mid+1,r,d+1);
47 }
48 int query(int l,int r){
49     if(l==r) return a[l];
50     int d=log[pos[l]]-log[pos[l]^pos[r]];
51     return max(max(p[d][l],p[d][r]),s[d][l]+s[d][r]);
52 }
53 int main(){
54 //    freopen("testdata.in","r",stdin);
55     n=read();for(int i=1;i<=n;++i) a[i]=read();
56     len=2;while(len<n) len<<=1;
57     for(int i=2,l=len<<1;i<=l;++i) log[i]=log[i>>1]+1;
58     build(1,1,len,1);
59     m=read();
60     while(m--){
61         int l=read(),r=read();
62         print(query(l,r));
63     }
64     return Ot(),0;
65 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9826116.html

SP1043 GSS1 - Can you answer these queries I(猫树)相关推荐

  1. SP1043 GSS1 - Can you answer these queries I 猫树

    传送门 文章目录 题意: 思路: 题意: 思路: 猫树是一种可以O(nlogn)O(nlogn)O(nlogn)预处理,O(1)O(1)O(1)查询的数据结构.预处理的信息应该满足可合并的性质,与线段 ...

  2. 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} ...

  3. SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

    Can you answer these queries II 这是一道线段树的题目,维护历史版本,给出N(<=100000)个数字(-100000<=x<=100000),要求求出 ...

  4. HDU 4027 Can you answer these queries?(线段树/区间不等更新)

    传送门 Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/6576 ...

  5. 解题报告:SP1043 GSS4 - Can you answer these queries III(GSS线段树八部曲之三)(区间最大连续子段和)

    要注意输入的数据有坑,x可能大于y- 我们可以模块化编程,使得整个代码井井有条 函数可以重名,只要参数不一样就行. 来源 yxc老师的上课板书 然后就是简单的代码了 #include<iostr ...

  6. 另一个画风的GSS1 - Can you answer these queries I(猫树)

    前言 其实我觉得你看猫锟的解释也看不懂(主要是还有一些不良心的讲解者不讲清楚,当然这里不是针对了qwq) 猫锟链接 Solution 考虑我们的线段树是个啥玩意? 每一层都是一堆区间叠在一起. 我们在 ...

  7. Can you answer these queries III (线段树维护最大子段和)

    题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...

  8. SPOJ - GSS3 Can you answer these queries III(线段树+区间合并)

    题目链接:点击查看 题目大意:给出一个长度为n的序列,进行m次操作: 1 x y  查询区间[l,r]中的最大连续子段和 0 x y  将第x个数修改为y 题目分析:因为涉及到单点修改和区间查询等操作 ...

  9. [HDOJ4027]Can you answer these queries?(线段树,特殊成段更新,成段查询)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027 RT,该题要求每次更新是更新所有节点,分别求平方根,查询是求和.昨晚思前想后找有没有一个数学上的 ...

最新文章

  1. android控制wifi状态
  2. Java配置dbeaver_ubuntu我的工具安装 eclipse、dbeaver、jdk、kdesvn、
  3. Java举例include_Java StringUtils.getFilenameExtension方法代码示例
  4. 2018年秋计算机基础在线作业,《计算机应用基础》2017年的秋学期在线作业三.doc...
  5. JVM内存结构|本地方法栈和堆
  6. webrtp官方demo运行
  7. 向iOS开发者介绍C++
  8. 在ASP.NET Core中使用的ML.NET模型构建器入门
  9. 【C语言 基础】什么流程控制?
  10. levy过程、扩散过程、随机过程带跳
  11. Oracle数据库存储过程 ,去除给定字符串中重复的字符串
  12. [MySql]默认密码的查找与修改
  13. ElemengUI:轮播图组件高度设置为全屏
  14. Rust : Pointer......to be continued
  15. python压缩视频_如何压缩视频大小?
  16. 文档管理系统mindoc安装
  17. excel表格自动填充为汉字拼音首字母
  18. 房地产公司网站建设需要多少钱
  19. 电脑系统故障维修,系统C盘满了怎么办?教你c盘清理方法
  20. Android Studio4.0|XXX keeps stopping

热门文章

  1. Linux命令之touch命令
  2. 领英发布《2016中国新一线城市职场发达程度报告》
  3. AcceptEx浅析
  4. oracle数据库 生成awr报告、ash报告详细步骤
  5. Oracle 性能优化之AWR、ASH和ADDM(含报告生成和参数解读)
  6. 【报告分享】活跃长者驱动的健康市场-CCAF(附下载)
  7. 经销商回收旧iPhone 换新机还可获得补贴
  8. 2008年C-NCAP各批次公布结果得分总排名
  9. Oozie 集成 Hive
  10. 交叉验证(Cross Validation)最详解