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 DOC
Docker DOC docker是提供给开发或管理人员的容器化部署项目工具 在linux上运行docker 常用命令 docker 安装 #先更新yum yum update; #设置docker仓 ...
- poj2377 Bad Cowtractors
思路: 最大生成树. 实现: #include <iostream> #include <cstdio> #include <vector> #include &l ...
- laravel权限控制Gate
实现思想 注册 位置: app/Providers/AuthServiceProvider.php $permissions = \App\AdminPermission::all(); foreac ...
- xcopy递归拷贝
递归拷贝 ::xcopy SOURCE_DIR DES_DIR\ /s SOURCE_DIR后面不需要加反斜杠
- 工作笔记:复制文件--从windows到ubuntu,再到fedora
最近在测试跨平台类库,于是写了一些小程序. 当然主要利用vs进行主要的代码开发.eclipse进行linux的调试. 那么需要不时同步项目文件. 考虑到项目简单,所以没有使用svn. 1. 从wind ...
- 关于Ubuntu上的服务文件
问题发现 今天在给ubuntu系统安装ftp服务时,一件奇怪的事引起了我的注意.当我服务安装完成后,想要测试一下是否能控制服务,便输入如下命令: service vsftpd restart 它返回的 ...
- Convert Sorted List to Balanced Binary Search Tree leetcode
题目:将非递减有序的链表转化为平衡二叉查找树! 参考的博客:http://blog.csdn.net/worldwindjp/article/details/39722643 利用递归思想:首先找到链 ...
- 关于MessageBox返回值
风格设置MB_OK. 此时无论点击确定还是点击X,都返回IDOK.风格设置MB_OKCANCEL,点击确认返回IDOK,点击取消和X都返回IDCANCEL.风格设置MB_YESNO,点击是返回IDYE ...
- OpenCV2:总结篇 工具方法函数
一.简介 OpenCV提供了一些工具方法函数来辅助完成图像运算 二.时间相关 1.getTickCount()和getTickFrequency() double tTime; tTime = (do ...
- js&jquery页面加载完执行
js <script type=”text/javascript”> window.onload=function (){ var userName=”xiaoming”; alert(u ...