给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数 [start, end] 。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的总和,并返回在结果列表中。

注意事项

在做此题前,建议先完成以下三题:线段树的构造, 线段树的查询,以及线段树的修改

您在真实的面试中是否遇到过这个题?

Yes
样例

对于数组 [1,2,7,8,5],查询[(1,2),(0,4),(2,4)], 返回 [9,23,20]

挑战

O(logN) time for each query

思路:看到区间求和问题,符合线段树适用连续区间统计或者查询的问题。所以,考虑构建合适的线段树来求解。

题目类型与区间最小数问题类似。先构建对应的线段树,然后查询;

vector<int>& A一定要加引用,否则,每次调用函数都要拷贝容器,很耗时!!!

/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*/
/*
思路:看到区间求和问题,符合线段树适用连续区间统计或者查询的问题。所以,考虑构建合适的线段树来求解。
题目类型与区间最小数问题类似。先构建对应的线段树,然后查询;
*/ class SegmentTreeNode33{
public:
int start,end;
long long sum;
SegmentTreeNode33* right,*left;
SegmentTreeNode33(int start,int end){
this->start=start;
this->end=end;
this->sum=0;
this->left=this->right=NULL;
}
}; class Solution {
public:
/**
*@param A, queries: Given an integer array and an query list
*@return: The result list
*/ //线段树构造;
SegmentTreeNode33* build(int start,int end,vector<int>& A){ //vector<int>& A一定要加引用,否则,每次调用函数都要拷贝容器很耗时!!!
if(start>end)
return NULL;
SegmentTreeNode33* root= new SegmentTreeNode33(start,end);
if(start!=end){
int mid=start+(end-start)/2;
root->left=build(start,mid,A);
root->right=build(mid+1,end,A);
root->sum=root->left->sum+root->right->sum;
}else
root->sum=A[start];
return root;
} //线段树查询;
long long query(SegmentTreeNode33* root,int start,int end){
if(root==NULL||start>end)
return 0;
if(start<=root->start&&end>=root->end)
return root->sum;
int mid=(root->start+root->end)/2;
if(start>mid)
return query(root->right,start,end);
else if(end<mid+1)
return query(root->left,start,end);
else
return query(root->right,mid+1,end)+query(root->left,start,mid);
} vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {
// write your code here
vector<long long> res;
SegmentTreeNode33* root=build(0,A.size()-1,A);
for(Interval qujian:queries){
res.push_back(query(root,qujian.start,qujian.end));
}
return res;
}
};

Lintcode---区间求和 I的更多相关文章

  1. POJ 2823 Sliding Window 线段树区间求和问题

    题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...

  2. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  3. vijos1740 聪明的质监员 (二分、区间求和)

    http://www.rqnoj.cn/problem/657 https://www.vijos.org/p/1740 P1740聪明的质检员 请登录后递交 标签:NOIP提高组2011[显示标签] ...

  4. LightOJ 1112 Curious Robin Hood (单点更新+区间求和)

    http://lightoj.com/volume_showproblem.php?problem=1112 题目大意: 1 i        将第i个数值输出,并将第i个值清0 2 i v     ...

  5. POJ 3468 A Simple Problem with Integers(线段树区间求和)

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  6. poj3468 A Simple Problem with Integers(线段树模板 功能:区间增减,区间求和)

    转载请注明出处:http://blog.csdn.net/u012860063 Description You have N integers, A1, A2, ... , AN. You need ...

  7. poj3468树状数组的区间更新,区间求和

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 47174   ...

  8. D 区间求和 [数学 树状数组]

    D 区间求和 题意:求 \[ \sum_{k=1}^n \sum_{l=1}^{n-k+1} \sum_{r=l+k-1}^n 区间前k大值和 \] 比赛时因为被B卡了没有深入想这道题 结果B没做出来 ...

  9. [用CDQ分治解决区间加&区间求和]【习作】

    [前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...

  10. 线段树 区间开方区间求和 & 区间赋值、加、查询

    本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...

随机推荐

  1. CentOS 6.9下双网卡绑定单个IP地址及装网卡绑定到一个网桥(转)

    说明:经过查阅,原来双网卡绑定一个IP的专业名词叫做bond,可以实现负载均衡:如果想要实现两张网卡绑定到一个网桥,基本思路是两张网卡设置同一个网桥是行不通的,但如果先实现bond,然后将bond绑定 ...

  2. JavaScrip数组去重--终极版

    第一种 var arr = [1,2,3,4,1,2,4,5,6];console.log(arr); Array.prototype.unique = function() { var n = [] ...

  3. 解决delphi10.2.3 android tools闪退

    解决delphi10.2.3 android tools闪退 修改D:\Program Files (x86)\Embarcadero\Studio\19.0\PlatformSDKs\android ...

  4. 扩展 jQuery datebox控件按钮

    功能需求: 自定义扩展,将原先的datebox控件按钮进行自定义的扩展: 1.问题: 对原先的时间按钮控件进行更改扩展,新增 “一刻钟” “半小时” “一小时” 选项. 获取原先的 datebox 对 ...

  5. Java程序猿笔试面试之String

    1.怎样实现字符串的反转比如:"how are you"--->"you are how" 2.怎样推断2个字符串是否有同样的字符组成 比如"a ...

  6. Less的安装与配置

    Less的安装与配置 Less与Sass 先说一段题外话,很多初学者在选择CSS 预处理语言不免会感到犹豫,作为CSS 的两大预处理语言Less与Sass,各自都有着很广泛的使用群体,我究竟该选哪个好 ...

  7. matplotlib绘制常用统计图

    常见统计图:单条折线图.多条折线图.直方图.柱状图.饼状图 #!/usr/bin/python # -*- coding: utf-8 -*- import numpy as np import ma ...

  8. 更改Mysql数据库存储位置

    默认安装位置 C:\Program Files\MySQL\MySQL Server 5.7 一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开MyS ...

  9. 让所有窗体都从DevExpress.XtraEditors.XtraForm继承

    让所有窗体都从DevExpress.XtraEditors.XtraForm继承. 第一步:在项目中添加 引用: DevExpress.BonusSkins.v14// DevExpress.Offi ...

  10. [ES6] 11. String Templates

    ECMAscript 6 lets us use string templates to gain a lot more control over strings in JavaScript. var ...