前言

最近沉迷于数据结构,感觉数据结构很有意思。

正文

分析

先来分类讨论一下

1. \(x2<y1\)

如果 \(y1<x2\) 的话,答案 \(=\max \limits_{ y1 \leq x \leq y2} \{ s_i \} - \min \limits_{x1 \leq x \leq x2} \{ s_i \}\)

其中 \(s_i\) 表示 \(\sum\limits_{j=1}^{i} a_j\) ,就是俗称的前缀和

这个东西可以用线段树维护。

2. \(x2>=y1\)

这个怎么处理呢

答案 \(=\) \(\max \begin{cases}\max \limits_{ y1 \leq x \leq y2} \{ s_i \} - \min \limits_{x1 \leq x \leq y1} \{ s_i \}\\ \max \limits_{ x2 \leq x \leq y2} \{ s_i \} - \min \limits_{x1 \leq x \leq x2} \{ s_i \}\\ f(x,y)\end{cases}\)

这里的 \(f\) 函数就是最大子段和。

不会用线段树求最大子段和的可以看这里

最上面的 \(2\) 个也是可以用线段树来维护的。

代码

最后要注意的一点是前缀和,我们知道区间 \([i,j]\) 的和 $ = s_j-s_{i-1}$,而不是 $ = s_j-s_{i}$

这个怎么处理呢,我们发现我们的题目全部都是用 \(Max\) 函数的答案减去 \(Min\) 函数的答案,所以,我们可以把线段树维护的 \(\min\) 全部减去 \(a_{i}\)

现在这份代码就能 \(A\) 了

  1. #include <bits/stdc++.h>
  2. #define ls num<<1
  3. #define rs num<<1|1
  4. using namespace std;
  5. typedef long long ll;
  6. template<typename T>inline void read(T &FF){
  7. T RR=1;FF=0;char CH=getchar();
  8. for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
  9. for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
  10. FF*=RR;
  11. }
  12. template<typename T>void write(T x){
  13. if(x<0)putchar('-'),x*=-1;
  14. if(x>9)write(x/10);
  15. putchar(x%10+48);
  16. }
  17. template<typename T>void writen(T x){
  18. write(x);
  19. puts("");
  20. }
  21. const int MAXN=5e4+10;
  22. struct Tree{
  23. int l,r;
  24. ll lans,rans,sum,ans,max,min;
  25. }t[MAXN*4];
  26. int a[MAXN],x,y,n,T,T_,l1,r1,l2,r2;
  27. ll s[MAXN];
  28. Tree pushup(Tree L,Tree R){
  29. Tree z;
  30. z.sum=L.sum+R.sum;
  31. z.lans=max(L.lans,L.sum+R.lans);
  32. z.rans=max(R.rans,R.sum+L.rans);
  33. z.ans=max(max(L.ans,R.ans),L.rans+R.lans);
  34. z.max=max(L.max,R.max);
  35. z.min=min(L.min,R.min);
  36. z.l=L.l;z.r=R.r;
  37. return z;
  38. }
  39. void build(int l,int r,int num){
  40. if(l==r){
  41. t[num].l=l;
  42. t[num].r=r;
  43. t[num].sum=a[l];
  44. t[num].lans=a[l];
  45. t[num].rans=a[l];
  46. t[num].ans=a[l];
  47. t[num].max=s[l];
  48. t[num].min=s[l]-a[l];
  49. return;
  50. }
  51. int mid=(l+r)>>1;
  52. build(l,mid,ls);
  53. build(mid+1,r,rs);
  54. t[num]=pushup(t[ls],t[rs]);
  55. }
  56. Tree query(int num){
  57. if(x<=t[num].l&&t[num].r<=y)return t[num];
  58. if(t[rs].l>y)return query(ls);
  59. if(t[ls].r<x)return query(rs);
  60. return pushup(query(ls),query(rs));
  61. }
  62. ll Max(int num){
  63. if(t[num].l>=x&&t[num].r<=y)return t[num].max;
  64. if(t[ls].r<x)return Max(rs);
  65. if(t[rs].l>y)return Max(ls);
  66. return max(Max(ls),Max(rs));
  67. }
  68. ll Min(int num){
  69. if(t[num].l>=x&&t[num].r<=y)return t[num].min;
  70. if(t[ls].r<x)return Min(rs);
  71. if(t[rs].l>y)return Min(ls);
  72. return min(Min(ls),Min(rs));
  73. }
  74. ll Mx(int a,int b){
  75. x=a;y=b;
  76. return Max(1);
  77. }
  78. ll Mn(int a,int b){
  79. x=a;y=b;
  80. return Min(1);
  81. }
  82. ll qy(int a,int b){
  83. x=a;y=b;
  84. return query(1).ans;
  85. }
  86. int main(){
  87. read(T);
  88. while(T--){
  89. read(n);
  90. for(int i=1;i<=n;i++)read(a[i]);
  91. for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
  92. build(1,n,1);
  93. read(T_);
  94. while(T_--){
  95. read(l1);read(r1);read(l2);read(r2);
  96. if(r1>l2)writen(max(qy(l2,r1),max(Mx(l2,r2)-Mn(l1,l2),Mx(r1,r2)-Mn(l1,r1))));
  97. else writen(Mx(l2,r2)-Mn(l1,r1));
  98. }
  99. }
  100. return 0;
  101. }

后记

这篇题解如果有问题可以私信或评论,告诉我,一起完善

题解 SP2916 【GSS5 - Can you answer these queries V】的更多相关文章

  1. SP2916 GSS5 - Can you answer these queries V

    给定一个序列.查询左端点在$[x_1, y_1]$之间,且右端点在$[x_2, y_2]$之间的最大子段和,数据保证$x_1\leq x_2,y_1\leq y_2$,但是不保证端点所在的区间不重合 ...

  2. SPOJ GSS5 Can you answer these queries V

    Time Limit: 132MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Description You are g ...

  3. 【SP2916】Can you answer these queries V - 线段树

    题面 You are given a sequence \(a_1,a_2,...,a_n\). (\(|A[i]| \leq 10000 , 1 \leq N \leq 10000\)). A qu ...

  4. SPOJ GSS5 Can you answer these queries V ——线段树

    [题目分析] GSS1上增加区间左右端点的限制. 直接分类讨论就好了. [代码] #include <cstdio> #include <cstring> #include & ...

  5. [GSS5] Can you answer these queries V

    大力讨论. luogu上交spoj的题卡的一比... 难受 wa了好几次,原因大概首先求的是非空区间,不能乱和0取max,第二点是求无相交的解时,在两段求lmx和rmx的时候可以取max(0). 区间 ...

  6. SPOJ 2916 GSS5 - Can you answer these queries V

    传送门 解题思路 和GSS1相似,但需要巨恶心的分类讨论,对于x1<=y1< x2< =y2 这种情况 , 最大值应该取[x1,y1]的右端最大+[y1+1,x2-1]的和+[x2, ...

  7. GSS5 spoj 2916. Can you answer these queries V 线段树

    gss5 Can you answer these queries V 给出数列a1...an,询问时给出: Query(x1,y1,x2,y2) = Max { A[i]+A[i+1]+...+A[ ...

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

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

  9. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

随机推荐

  1. RocketMQ介绍与实践

    一.RocketMQ介绍         1.相关术语名词 1.  NameSrv:是一个几乎无状态节点,可集群部署,节点之间无任何信息同步. 2.  Broker:分为Master与Slave,一个 ...

  2. Appium移动自动化框架功能概括

    小编说:Appium 是一个移动端自动化测试开源工具,可以针对不同的平台用一套API 来编写测试用例.本文对Appium自动化测试框架的功能进行了概括. 本文选自<软件自动化测试开发>,了 ...

  3. Samtec与Neoconix达成合作并和II-VI推出新产品

    序言:Samtec近日动作不断, 近日Samtec与Neoconix达成合作并和II-VI推出新产品,以下是详细内容. Samtec与Neoconix签订Neoconix PCBeam 技术授权协议, ...

  4. Java基础--面向对象(上)

    一.面向对象的概念 1.什么是面向对象? (1)面向对象是一种符合人类思维习惯的编程思想. (2)面向对象是一种思考问题的思维方式. 2.三种特性: (1)封装性 (2)继承性 (3)多态性 3.建立 ...

  5. Everything-快速找到你的文件,电脑前的你值得拥有

    如果你也是一位电脑使用者,那么你可以考虑下载这个"Everything". Everything是一款非常非常强大的软件.相信不少电脑用户,特别是Windows用户,都尝试使用过W ...

  6. Docker部署LAMP项目

    前言 之前我们学习了如何在Linux部署LAMP项目,今天我们来学习一下如何在Docker下部署LAMP项项目吧! Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条 ...

  7. 字符串、bute[]数组和十六进制字符串的相互转换

    1.字符串转换成十六进制字符串 public static String str2HexStr(String str) { if (EncodingUtil.isEmpty(str)) { retur ...

  8. SpringBoot是如何实现自动配置的?--SpringBoot源码(四)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三 ...

  9. 使用 ALSAlib 播放 wav

    在 ARM 2440 开发板上正常播放 16bit  44100 采样率的wav , 为了程序简单,没有判断返回值. 补充,在 ubunto 上也能正常播放. 编译方法: arm-linux-gcc ...

  10. IntelliJ IDEA 2018.3 x64的破解和安装

    IntelliJ IDEA 2018.3 x64的破解和安装 前言 IntelliJ IDEA 作为一个优秀的Java开发环境,深受许多开发者喜爱,但是它的价格却贵得让人无法接受,这篇文章将介绍永久激 ...