LA 3938 动态最大连续和(线段树)
https://vjudge.net/problem/UVALive-3938
题意:
给出一个长度为n的整数序列D,你的任务是对m个询问作出回答。对于询问(a,b),需要找到两个下标x和y,使得a≤x≤y≤b,并且Dx+Dx+1+...+Dy尽量大。如果有多组满足条件的x和y,x应该尽量小。如果还有多解,y应该尽量小。
思路:
线段树。
这道题目挺麻烦的,也是参考了刘汝佳的代码。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = + ;
typedef pair<int, int> Interval; int n, m;
long long sum[maxn];
int QL, QR; struct node
{
Interval max_sub; //最大连续和
int max_prefix; //最大前缀和
int max_suffix; //最大后缀和
}t[maxn]; long long cacl(int L, int R)
{
return sum[R] - sum[L - ];
} Interval better(Interval a, Interval b)
{
if (cacl(a.first, a.second) != cacl(b.first, b.second))
return cacl(a.first, a.second) > cacl(b.first, b.second) ? a : b;
return a < b ? a : b;
} void build_tree(int L, int R, int k)
{
if (L == R)
{
t[k].max_prefix = L;
t[k].max_suffix = L;
t[k].max_sub = make_pair(L, L);
return;
}
else
{
int mid = (L + R) / ;
int lc = * k, rc = * k + ;
build_tree(L, mid, lc);
build_tree(mid + , R, rc); //计算最大前缀和
long long x1 = cacl(L, t[lc].max_prefix);
long long x2 = cacl(L, t[rc].max_prefix);
if (x1 == x2) t[k].max_prefix = min(t[lc].max_prefix, t[rc].max_prefix);
else t[k].max_prefix = x1 > x2 ? t[lc].max_prefix : t[rc].max_prefix; //计算最大后缀和
x1 = cacl(t[lc].max_suffix, R);
x2 = cacl(t[rc].max_suffix, R);
if (x1 == x2) t[k].max_suffix = min(t[lc].max_suffix, t[rc].max_suffix);
else t[k].max_suffix = x1 > x2 ? t[lc].max_suffix : t[rc].max_suffix; //计算最大连续和
t[k].max_sub = better(t[lc].max_sub, t[rc].max_sub);
t[k].max_sub = better(t[k].max_sub, make_pair(t[lc].max_suffix, t[rc].max_prefix));
}
} Interval query_suffix(int L, int R, int k)
{
if (t[k].max_suffix >= QL) return make_pair(t[k].max_suffix, R);
int mid = (L + R) / ;
int lc = * k, rc = * k + ;
if (QL > mid) return query_suffix(mid + , R, rc);
Interval x = query_suffix(L, mid, lc);
x.second = R;
return better(x, make_pair(t[rc].max_suffix, R));
} Interval query_prefix(int L, int R, int k)
{
if (QR >= t[k].max_prefix) return make_pair(L, t[k].max_prefix);
int mid = (L + R) / ;
int lc = * k, rc = * k + ;
if (QR <= mid) return query_prefix(L, mid, lc);
Interval x = query_prefix(mid + , R, rc);
x.first = L;
return better(x, make_pair(L, t[lc].max_prefix));
} Interval query(int L, int R, int k)
{
if (QL <= L && QR >= R) return t[k].max_sub;
int mid = (L + R) / ;
int lc = * k;
int rc = * k + ;
if (QR <= mid) return query(L, mid, lc); //完全在左半段
if (QL > mid) return query(mid + , R, rc); //完全在右半段
Interval x1 = query_suffix(L, mid, lc); //左半段的后缀
Interval x2 = query_prefix(mid + , R, rc); //右半段的前缀
Interval x3 = better(query(L, mid, lc), query(mid + , R, rc));
return better(make_pair(x1.first, x2.second), x3);
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int x;
int kase = ;
while (~scanf("%d%d", &n, &m))
{
sum[] = ;
for (int i = ; i <= n; i++)
{
scanf("%d", &x);
sum[i] = sum[i - ] + x;
}
build_tree(, n, );
printf("Case %d:\n", ++kase);
while (m--)
{
scanf("%d%d", &QL, &QR);
Interval ans = query(, n, );
printf("%d %d\n", ans.first, ans.second);
}
}
}
LA 3938 动态最大连续和(线段树)的更多相关文章
- LA 3938 动态最大连续和 线段树
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- LA 3938 动态最大连续和
题目链接:https://vjudge.net/contest/146667#problem/C 题意:动态的求一个区间的最大连续和. 分析: 看上去可以RMQ去做,但是,当分成两个部分,原来的部分的 ...
- 【BZOJ3295】动态逆序对(线段树,树状数组)
[BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...
- 指针-动态开点&合并线段树
一个知识点不在一道题里说是没有灵魂的 线段树是用来处理区间信息的咯 但是往往因为需要4倍空间让许多人退却,而动态开点的线段树就非常棒 仿佛只用2倍就可以咯 指针保存位置,即节点信息,是很舒适的,所以用 ...
- BZOJ 4636 (动态开节点)线段树
思路: 偷懒 懒得离散化 搞了个动态开节点的线段树 (其实是一样的--..) 注意会有a=b的情况 要判掉 //By SiriusRen #include <cstdio> #includ ...
- 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆
最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- UVA_12697 满足条件的最短连续和 线段树维护
好印象深刻的题,前天选拔赛给跪了.怪我这种关键题没敲出来. 题意很简单,给你一串无规则的数列,再给个m值,求出满足 数列和>=m的长度最小的连续子串...确实一开始卡住了,因为看数据肯定是nlo ...
- AcWing1264. 动态求连续区间和 (线段树做法)
1.题目 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和. 输入格式 第一行包含两个整数 n 和 m,分别表示数的个数和操作次数. 第二行包含 n ...
随机推荐
- 批量远程执行linux服务器程序--基于pxpect(多进程、记日志版)
#!/usr/bin/python '''Created on 2015-06-09@author: Administrator''' import pexpect import os,sys fro ...
- SSL安装方法一:在Windows Server 2008安装SSL证书(IIS 7.0)
购买的是GlobalSign 公司的通配符域名型SSL 大致的意思就是“通配符公用名填写*.域名.com,这个下面的所有子域名是不受数量限制的,*可以换成任意字符” 1 生成数字证书签名请求文件(CS ...
- thinkphp---手机访问切换模板!
手机访问切换模板:一般用在手机在做自适应的情况. 第一步:需要添加判断是否是手机访问的方法: http://www.cnblogs.com/e0yu/p/7561811.html 第二步:Home / ...
- couldn't connect to host
“couldn't connect to host” 这样的错误可能是主机不可到达,或者端口不可到达. ping OK只代表主机可以到达. 端口不可到达可能是由于HTTP 服务器未启动或者监听在其他端 ...
- 【转】jQuery.ajax向后台传递数组问题
$.ajax({ url: "/xxx", type: "GET", data: { "boxIds": boxIds, "box ...
- numpy中的convolve的理解
https://blog.csdn.net/u011599639/article/details/76254442 函数 numpy.convolve(a, v, mode=‘full’),这是num ...
- nginx:服务器集群
一.Nginx的事件处理机制 对于一个基本的web服务器来说,事件通常有三种类型,网络事件.信号.定时器. 首先看一个请求的基本过程:建立连接---接收数据---发送数据 . 再次看系统底层的操作 : ...
- Django - rest - framework - 下
一.视图三部曲 https://www.cnblogs.com/wupeiqi/articles/7805382.html 使用混合(mixins) 之前得视图部分 # urls.py from dj ...
- Key Set---hud5363(快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5363 #include <iostream> #include <cstdlib&g ...
- python并发
并发方式 线程(Thread) 多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外).然而多线程所带来的 ...