区间求和Ⅱ
2015-10-13 10:42
302 查看
在类的构造函数中给一个整数数组, 实现两个方法
对于 query(start, end), 返回数组中下标 start 到 end的 和。
对于 modify(index, value), 修改数组中下标为 index上的数为 value.
样例
给定数组 A =
query(start, end)和
modify(index, value):
对于 query(start, end), 返回数组中下标 start 到 end的 和。
对于 modify(index, value), 修改数组中下标为 index上的数为 value.
样例
给定数组 A =
[1,2,7,8,5].
query(0, 2), 返回
10.
modify(0, 4), 将 A[0] 修改为 4.
query(0, 1), 返回
6.
modify(2, 1), 将 A[2] 修改为 1.
query(2, 4), 返回
14.
class Solution { private: struct segmentTreeNode{ int start,end; long long val; segmentTreeNode *left,*right; segmentTreeNode(int l,int r): start(l),end(r),left(0),right(0){} }; segmentTreeNode* build(int lo,int hi){ if(lo>hi) return NULL; segmentTreeNode* root=new segmentTreeNode(lo,hi); if(lo==hi) return root; int mid=lo+(hi-lo)/2; root->left=build(lo,mid); root->right=build(mid+1,hi); return root; } long long query(segmentTreeNode*root,int low,int high){ if(low>high) return 0; if(low==root->start&&high==root->end){ return (long long)root->val; } int mid=root->start+(root->end-root->start)/2; long long res=query(root->left,low,min(mid,high))+query(root->right,max(low,mid+1),high); return res; } void getsum(segmentTreeNode *root,int i,int value){ if(root->start==root->end){ root->val=value; return; } int mid=root->start+(root->end-root->start)/2; if(i<=mid) getsum(root->left,i,value); else getsum(root->right,i,value); root->val=root->left->val+root->right->val; return; } vector<int>v; segmentTreeNode *root; public: Solution(vector<int> A) { v=A; root=build(0,A.size()-1); for(int i=0;i<A.size();i++) modify(i,A[i]); } long long query(int low, int high) { return query(root,low,high); } void modify(int index, int value) { v[index]=value; //root=build(0,v.size()-1); getsum(root,index,value); } };
相关文章推荐
- CDH离线安装成功,Mark下,20151012
- Notification(通知)的使用简介
- 尺寸工具箱DimenUtils
- java判断是否是周末
- GC overhead limit exceeded : Spark
- 路径说明
- dedecms文件目录结构
- 利用GitHook构建持续交付和部署
- Android开发总结笔记 Date&Time(时间日期相关组件) 1-1-16
- 游戏服务器端开发要点
- 这些git技能够你用一年了
- 读取数据从Uri
- 广播工具箱
- Activity
- c#datagrid的每行的单击事件
- 虚拟引擎
- Mysql 数据库之常用命令[更新中...]
- 如何很好的使用Linq的Distinct方法
- ZBar在Windows上的使用(1)-ImageMagick
- Ubuntu中修改命令终端Terminal的配色方案