题目传送门

题意:动态最大连续子序列和,静态的题目

分析:nlogn的归并思想。线段树维护结点的三个信息,最大前缀和,最大后缀和,该区间的最大和的两个端点,然后答案是三个的better。书上用pair保存端点,用自带的<来得到最优。

#include <bits/stdc++.h>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
typedef pair<int, int> P;
const int N = 5e5 + 5;
ll sum[N];
struct  ST  {int pre[N<<2], suf[N<<2];P sub[N<<2];ll get_sum(P p) {return sum[p.second] - sum[p.first-1];}P better(P a, P b)  {ll v1 = get_sum (a), v2 = get_sum (b);if (v1 != v2) return v1 > v2 ? a : b;else  return a < b ? a : b;}void push_up(int l, int r, int rt) {pre[rt] = better (make_pair (l, pre[rt<<1]), make_pair (l, pre[rt<<1|1])).second; //该区间的最大前缀suf[rt] = better (make_pair (suf[rt<<1], r), make_pair (suf[rt<<1|1], r)).first; //该区间的最大后缀sub[rt] = better (sub[rt<<1], sub[rt<<1|1]);     //该区间的最大连续和:max (左前缀,右后缀+左前缀,右后缀)sub[rt] = better (sub[rt], make_pair (suf[rt<<1], pre[rt<<1|1]));   //不一定就是最大前缀或最大后缀}void build(int l, int r, int rt)   {if (l == r)  {pre[rt] = suf[rt] = l;sub[rt] = make_pair (l, l);return ;}int mid = (l + r) >> 1;build (lson);  build (rson);push_up (l, r, rt);}P query_pre(int ql, int qr, int l, int r, int rt)  {if (pre[rt] <= qr) return make_pair (l, pre[rt]);int mid = (l + r) >> 1;if (qr <= mid) return query_pre (ql, qr, lson);P p = query_pre (ql, qr, rson);    p.first = l;return better (p, make_pair (l, pre[rt<<1]));}P query_suf(int ql, int qr, int l, int r, int rt)  {if (suf[rt] >= ql) return make_pair (suf[rt], r);int mid = (l + r) >> 1;if (ql > mid)   return query_suf (ql, qr, rson);P p = query_suf (ql, qr, lson);    p.second = r;return better (p, make_pair (suf[rt<<1|1], r));}P query(int ql, int qr, int l, int r, int rt)   {if (ql <= l && r <= qr)    return sub[rt];int mid = (l + r) >> 1;if (qr <= mid)    return query (ql, qr, lson);if (ql > mid)    return query (ql, qr, rson);P p1 = query_suf (ql, qr, lson);               //ql <= mid < qrP p2 = query_pre (ql, qr, rson);                //和push_up一样P p3 = better (query (ql, qr, lson), query (ql, qr, rson));    //该区间的最大连续和:max (左前缀,右后缀+左前缀,右后缀)return better (p3, make_pair (p1.first, p2.second));}
}st;int main(void)  {int n, q, cas = 0;while (scanf ("%d%d", &n, &q) == 2) {for (int i=1; i<=n; ++i)    {scanf ("%lld", &sum[i]); sum[i] += sum[i-1];}st.build (1, n, 1);printf ("Case %d:\n", ++cas);int ql, qr;while (q--)    {scanf ("%d%d", &ql, &qr);P ans = st.query (ql, qr, 1, n, 1);printf ("%d %d\n", ans.first, ans.second);}}return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/5033694.html

线段树(区间合并) LA 3989 Ray, Pass me the dishes!相关推荐

  1. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

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

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

  3. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  4. CodeForces - 1539F Strange Array(线段树区间合并)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,规定位置 iii 的贡献是:设 x=a[i]x=a[i]x=a[i],选择一个包含 iii 的区间 [l,r][l,r][l,r],将其中 ...

  5. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  6. 2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

    传送门 文章目录 题意: 思路: 题意: 题面挺绕口的,还是看原题比较好. 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后, ...

  7. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  8. HDU3308 线段树区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 ,简单的线段树区间合并. 线段树的区间合并:一般是要求求最长连续区间,在PushUp()函数中实 ...

  9. HDU1540(线段树区间合并)

    很经典的一道题,线段树区间合并非常好的一道入门题,每个节点保存区间连续1的最大左串长度,最大右串长度,以及区间最大长度(常规的三种信息维护),更新操作时注意push_up函数,针对不同的问题,push ...

最新文章

  1. QIIME 2教程. 27语义类型Semantic(2021.2)
  2. python 爬虫 学习笔记(一)Scrapy框架入门
  3. MultipartResolver实现文件上传功能
  4. Kubernetes基本概念之Name和NameSpace
  5. Oracle 分析函数--Row_Number()
  6. IIS6下配置fastcgi的php的教程
  7. U92904-画地为佬【二分,结论】
  8. onvif学习笔记7:一个C++封装的onvif代码的阅读笔记
  9. 用C/C++写CGI程序
  10. 【权限设计】如何以“权限”为单位的进行权限设计(二)
  11. Java编写敏感词过滤程序
  12. chrome浏览器糟糕WEBGL遇到了问题,如何解决
  13. 【技术贴】图文教程 最新QQ空间免费背景音乐添加方法||QQ空间免费添加背景音乐。...
  14. 爱查快递API使用讲解
  15. C语言经典项目之二——扫雷
  16. Altium Designer 17及以上版本快速画出Keep-Out layer层以便于覆铜操作
  17. win10服务器系统进不去怎么办,win10开机进不去系统怎么办。
  18. FOCUS projects 5 Pro(照片景深处理软件)官方正式版V5.34.03722 | 景深合成软件下载
  19. 基于React、Typescript和Solidity的NFT完整教程
  20. 球差电镜测试常见的问题及解答(一)

热门文章

  1. 如何编写优质的API文档
  2. 在线ASCII流程图编辑器工具
  3. 修改firefox的默认缩放比
  4. ubuntu 安装Docker教程
  5. 说说如何在 Spring 框架中使用 SpEL 表达式
  6. 大数据应用现状:从发现价值到创造价值
  7. 跟我一起考PMP---项目成本管理
  8. 2013着重发展的4个方向
  9. 1. Windows Powershell初接触
  10. redis的IM的聊天工具