Can you answer these queries(spoj 1043)
题意:多次查询区间最长连续字段和
/*
用线段树维护区间最长子段和,最长左子段和,最长右子段和。
*/
#include<cstdio>
#include<iostream>
#define N 50010
using namespace std;
int a[N],s[N],sum[N*],lsum[N*],rsum[N*],n,m;
void push_up(int k,int l,int r){
int mid=l+r>>;
lsum[k]=max(lsum[k*],s[mid]-s[l-]+lsum[k*+]);
rsum[k]=max(rsum[k*+],rsum[k*]+s[r]-s[mid]);
sum[k]=max(max(sum[k*],sum[k*+]),rsum[k*]+lsum[k*+]);
sum[k]=max(max(sum[k*],sum[k*+]),rsum[k*]+lsum[k*+]);
}
void build(int l,int r,int k){
int mid=l+r>>;
if(l==r){
sum[k]=lsum[k]=rsum[k]=a[l];
return;
}
build(l,mid,k*);
build(mid+,r,k*+);
push_up(k,l,r);
}
int query_l(int l,int r,int k,int x,int y){//询问最长左子段和
if(l==x&&r==y)return lsum[k];
int mid=l+r>>;
if(y<=mid) return query_l(l,mid,k*,x,y);
else {
return max(lsum[k*],s[mid]-s[l-]+query_l(mid+,r,k*+,mid+,y));
}
}
int query_r(int l,int r,int k,int x,int y){//询问最长右子段和
if(l==x&&r==y)return rsum[k];
int mid=l+r>>;
if(x>mid) return query_r(mid+,r,k*+,x,y);
else {
return max(rsum[k*+],s[r]-s[mid]+query_r(l,mid,k*,x,mid));
}
}
int query(int l,int r,int k,int x,int y){
if(l==x&&r==y) return sum[k];
int mid=l+r>>;
if(y<=mid)return query(l,mid,k*,x,y);
else if(x>mid) return query(mid+,r,k*+,x,y);
else {
int ls=query_r(l,mid,k*,x,mid);
int rs=query_l(mid+,r,k*+,mid+,y);
return max(max(query(l,mid,k*,x,mid),query(mid+,r,k*+,mid+,y)),ls+rs);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),s[i]=s[i-]+a[i];
build(,n,);
scanf("%d",&m);
for(int i=;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",query(,n,,x,y));
}
return ;
}
Can you answer these queries(spoj 1043)的更多相关文章
- kuangbin专题七 HDU4027 Can you answer these queries? (线段树)
A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use ...
- H - Can you answer these queries? - (区间查询更新)
有一列数,(都是2^63范围内的并且都大于0的整数),现在呢有一些操作, 操作 0 可以把区间LR内的所有数都变成它的平方根数(是取整后的),操作 1 可以就是求区间LR内的和了. 分析:因为这个操作 ...
- HDU - 4027 Can you answer these queries?(线段树)
给定一个长度为n的序列,m次操作. 每次操作 可以将一个区间内的所有数字变为它的根号. 可以查询一个区间内所有元素的和. 线段树的初级应用. 如果把一个区间内的元素都改为它的根号的话,是需要每个数字都 ...
- HDU 4027 Can you answer these queries?(线段树区间开方)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组
F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...
- Spring-2-B Save the Students(SPOJ AMR11B)解题报告及测试数据
Save the Students Time Limit:134MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descri ...
- Can you answer these queries I SPOJ - GSS1 (线段树维护区间连续最大值/最大连续子段和)
You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A query is defi ...
- 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 ...
- HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
随机推荐
- 从零开始docker部署flask
1.下载一个Ubuntu镜像 2.启动镜像,使用apt-get安装python.安装pip,建议也装个vim吧 3.通过以上的容器生成一个新的镜像,命令如下docker commit afcaf46e ...
- AJPFX关于多线程概述及应用
一.认识多任务.多进程.单线程.多线程要认识多线程就要从操作系统的原理说起. 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情.比如你在copy东西的时候 ...
- 毕业设计:主界面(ViewPager + FragmentPagerAdapter)
一.主要思路 应用程序的主界面包含三个部分:顶部标题栏.底部标识栏和中间的内容部分.顶部标题栏内容基本不变,用于显示当前模块或者整个应用的名称:底部既能标识出当前Page,又能通过触发ImageBut ...
- PYTHON PIP和kivy安装教程
我们安装pip.我们同样需要在Python的官网上去下载 下载地址:https://pypi.python.org/pypi/pip 下载完成之后,解压到一个文件夹,用CMD控制台进入解压目录,输入: ...
- MPP(大规模并行处理)简介
1. 什么是MPP? MPP (Massively Parallel Processing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和 ...
- QT+lambda 表达式
#include "mainwidget.h" #include <QPushButton> #include <QDebug> MainWidget::M ...
- 让idea调试不进入class文件中去
- POJ-3278 抓住这头牛
广搜解决. 广搜搜出最短路,直接输出返回就行了. 每个点只搜一次,而且界限进行一次判断. else 语句里面不要用if else if,这样的话就直走一条路了. #include <ios ...
- openjudge-1664 放苹果
总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输 ...
- [LUOGU] P3004 [USACO10DEC]宝箱Treasure Chest
第一眼:区间DP,可以瞎搞 f[i][j]=max(sum(i,j)-f[i+1][j],sum(i,j)-f[i][j-1]) 提出来就是f[i][j]=sum(i,j)-min(f[i+1][j] ...