前言

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

正文

分析

先来分类讨论一下

1. x2<y1x2<y1x2<y1

如果 y1<x2y1<x2y1<x2 的话,答案 =max⁡y1≤x≤y2{si}−min⁡x1≤x≤x2{si}=\max \limits_{ y1 \leq x \leq y2} \{ s_i \} - \min \limits_{x1 \leq x \leq x2} \{ s_i \}=y1≤x≤y2max​{si​}−x1≤x≤x2min​{si​}

其中 sis_isi​ 表示 ∑j=1iaj\sum\limits_{j=1}^{i} a_jj=1∑i​aj​ ,就是俗称的前缀和

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

2. x2>=y1x2>=y1x2>=y1

这个怎么处理呢

答案 === max⁡{max⁡y1≤x≤y2{si}−min⁡x1≤x≤y1{si}max⁡x2≤x≤y2{si}−min⁡x1≤x≤x2{si}f(x,y)\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}max⎩⎪⎪⎨⎪⎪⎧​y1≤x≤y2max​{si​}−x1≤x≤y1min​{si​}x2≤x≤y2max​{si​}−x1≤x≤x2min​{si​}f(x,y)​

这里的 fff 函数就是最大子段和。

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

最上面的 222 个也是可以用线段树来维护的。

代码

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

这个怎么处理呢,我们发现我们的题目全部都是用 MaxMaxMax 函数的答案减去 MinMinMin 函数的答案,所以,我们可以把线段树维护的 min⁡\minmin 全部减去 aia_{i}ai​

现在这份代码就能 AAA 了

#include <bits/stdc++.h>
#define ls num<<1
#define rs num<<1|1
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &FF){T RR=1;FF=0;char CH=getchar();for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);FF*=RR;
}
template<typename T>void write(T x){if(x<0)putchar('-'),x*=-1;if(x>9)write(x/10);putchar(x%10+48);
}
template<typename T>void writen(T x){write(x);puts("");
}
const int MAXN=5e4+10;
struct Tree{int l,r;ll lans,rans,sum,ans,max,min;
}t[MAXN*4];
int a[MAXN],x,y,n,T,T_,l1,r1,l2,r2;
ll s[MAXN];
Tree pushup(Tree L,Tree R){Tree z;z.sum=L.sum+R.sum;z.lans=max(L.lans,L.sum+R.lans);z.rans=max(R.rans,R.sum+L.rans);z.ans=max(max(L.ans,R.ans),L.rans+R.lans);z.max=max(L.max,R.max);z.min=min(L.min,R.min);z.l=L.l;z.r=R.r;return z;
}
void build(int l,int r,int num){if(l==r){t[num].l=l;t[num].r=r;t[num].sum=a[l];t[num].lans=a[l];t[num].rans=a[l];t[num].ans=a[l];t[num].max=s[l];t[num].min=s[l]-a[l];return;}int mid=(l+r)>>1;build(l,mid,ls);build(mid+1,r,rs);t[num]=pushup(t[ls],t[rs]);
}
Tree query(int num){if(x<=t[num].l&&t[num].r<=y)return t[num];if(t[rs].l>y)return query(ls);if(t[ls].r<x)return query(rs);return pushup(query(ls),query(rs));
}
ll Max(int num){if(t[num].l>=x&&t[num].r<=y)return t[num].max;if(t[ls].r<x)return Max(rs);if(t[rs].l>y)return Max(ls);return max(Max(ls),Max(rs));
}
ll Min(int num){if(t[num].l>=x&&t[num].r<=y)return t[num].min;if(t[ls].r<x)return Min(rs);if(t[rs].l>y)return Min(ls);return min(Min(ls),Min(rs));
}
ll Mx(int a,int b){x=a;y=b;return Max(1);
}
ll Mn(int a,int b){x=a;y=b;return Min(1);
}
ll qy(int a,int b){x=a;y=b;return query(1).ans;
}
int main(){read(T);while(T--){read(n);for(int i=1;i<=n;i++)read(a[i]);for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];build(1,n,1);read(T_);while(T_--){read(l1);read(r1);read(l2);read(r2);if(r1>l2)writen(max(qy(l2,r1),max(Mx(l2,r2)-Mn(l1,l2),Mx(r1,r2)-Mn(l1,r1))));else writen(Mx(l2,r2)-Mn(l1,r1));}}return 0;
}

后记

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

题解 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. 【线段树】GSS5 - Can you answer these queries V(luogu-SPOJ 2916)

    正题 luogu-SPOJ 2916 题目大意 给你一个序列,有若干询问,每次给出左右端点的区间,问你最大字段和 解题思路 用线段树维护区间信息,询问的区间如果有交则分类讨论求解 code #incl ...

  3. 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 ...

  4. spoj 2916. Can you answer these queries V(线段树)

    题目链接:http://www.spoj.com/problems/GSS5/ 题意:给出n个数,求区间最大子段和,但是限制了子段的起点终点,起点要在[x1,y1]内,终点要在[x2,y2]内. 思路 ...

  5. HDU 1027 G - Can you answer these queries?

    http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Time Limit: 4000/2000 M ...

  6. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  7. 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

    动态DP--广义矩阵加速 SP1716 GSS3 - Can you answer these queries III description solution code [NOIP2018 提高组] ...

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

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

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

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

最新文章

  1. 用Python进行时间序列分解和预测
  2. 《用Python进行自然语言处理》第 5 章 分类和标注词汇
  3. 11月上旬息壤网络域名总量呈负增长 份额跌破1%
  4. Metail Design入门(一)
  5. cas登录成功后不跳转成功页面_SpringSecurity用户登录成功后页面跳转原理剖析
  6. vim安装时报错:Depends:vim-common (=2:7.4.1689-3ubuntu1.4) but 2:8.0.1453-1ubuntu1.1 is to be installed
  7. 109_Power Pivot客户ABC(帕累托)分析度量值写法(非计算列)
  8. 基于STC89C52单片机的LED显示电子钟的制作
  9. 常用分析模型---RFM客户价值模型
  10. 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
  11. 删除win10 qaa输入法
  12. Trading on Sentiment
  13. 新生儿住月子中心20天患败血症 什么是败血症?有哪些危害
  14. c语言实战项目之一 贪吃蛇(源码免费开放)
  15. android怎么做表格显示数据
  16. [Crypto]ECB模式攻击
  17. 智慧警保综合管理平台
  18. 自然语言c,自然语言处理_自然语言处理常用方法举例说明 - 人工智能 - 电子发烧友网...
  19. vlookup函数的使用(Excel中)
  20. 王道论坛机试指南学习笔记(二)数据结构

热门文章

  1. 内核态与用户态通信之eventfd使用
  2. 最先进的Git分布式仓库系统——是如何提升编程效率的?
  3. 2015062207 - 小诗一首(勉励自己)
  4. SAP-ABAP-小计收起/折叠明细项目-只显示小计内容
  5. Github Markdown 指定图片在光亮或暗黑模式展示
  6. bixby怎么编程_三星Galaxy S20:如何完全禁用Bixby
  7. java纳秒级时间戳_golang的time包:秒、毫秒、纳秒时间戳输出方式
  8. python 模拟微信浏览器请求_python+requests对app和微信小程序进行接口测试
  9. 对高校深入开展翻转课堂的建议
  10. 翻转课堂学习总结集—2015级