1. 题目

在类的构造函数中给一个整数数组, 实现两个方法 query(start, end)modify(index, value):

  • 对于 query(start, end), 返回数组中下标 start 到 end 的 和。
  • 对于 modify(index, value), 修改数组中下标为 index 上的数为 value.
样例1
输入:
[1,2,7,8,5]
[query(0,2),modify(0,4),query(0,1),modify(2,1),query(2,4)]
输出: [10,6,14]
说明:
给定数组 A = [1,2,7,8,5].
在query(0, 2)后, 1 + 2 + 7 = 10,
在modify(0, 4)后, 将 A[0] 修改为 4, A = [4,2,7,8,5].
在query(0, 1)后, 4 + 2 = 6.
在modify(2, 1)后, 将 A[2] 修改为 1,A = [4,2,1,8,5].
After query(2, 4), 1 + 8 + 5 = 14.样例2
输入:
[1,2,3,4,5]
[query(0,0),query(1,2),quert(3,4)]
输出: [1,5,9]
说明:
1 = 1
2 + 3 = 5
4 + 5 = 9挑战
query 和 modify 的时间复杂度需要为O(logN).

2. 解题

  • 参考 线段树 Segment Tree
class node
{public:int sum;int start, end;node *left, *right;node(int s, int e, int v):start(s),end(e),sum(v){left = right = NULL;}static node* build(vector<int>& A, int l, int r){if(l > r)return NULL;node* head = new node(l,r,A[l]);if(l == r)return head;int mid = l+((r-l)>>1);head->left = build(A,l,mid);head->right = build(A,mid+1,r);head->sum = 0;if(head->left)head->sum += head->left->sum;if(head->right)head->sum += head->right->sum;return head;}static long long query(node* head, int s, int e){if(s > head->end || e < head->start)return 0;if(head->start >= s && head->end <= e)return head->sum;int vl = query(head->left, s, e);int vr = query(head->right,s, e);return vl+vr;}static void modify(node* head, int id, int val){if(head->start == head->end){head->sum = val;return;}int mid = (head->start + head->end)/2;if(id > mid)modify(head->right, id, val);elsemodify(head->left, id, val);head->sum = 0;if(head->left)head->sum += head->left->sum;if(head->right)head->sum += head->right->sum;}
};
class Solution {node *head;
public:Solution(vector<int> A) {head = node::build(A,0,A.size()-1);}long long query(int start, int end) {return node::query(head, start,end);}void modify(int index, int value) {node::modify(head, index,value);}
};

100% 数据通过测试
总耗时: 1086ms

LintCode 207. 区间求和 II(线段树)相关推荐

  1. 51nod 1680区间求和 (dp+树状数组/线段树)

    不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...

  2. SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

    Can you answer these queries II 这是一道线段树的题目,维护历史版本,给出N(<=100000)个数字(-100000<=x<=100000),要求求出 ...

  3. NOI2016区间bzoj4653(线段树,尺取法,区间离散化)

    题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...

  4. luogu P5142 区间方差(线段树、乘法逆元)

    luogu P5142 区间方差 本题要求维护模区间方差,很明显是一道数据结构题. 我们化简方差公式: 而平均数等于 可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差. 区间和 ...

  5. 牛客 - 牛牛的Link Power II(线段树)

    题目链接:点击查看 题目大意:给出一个01字符串 s ,现在规定每两个 1 的贡献为其在字符串中的距离,现在有 m 次操作,每次操作会把一个位置将 0 变成 1 或者将 1 变成 0 ,问每次操作后字 ...

  6. 【BZOJ4653】[Noi2016]区间 双指针法+线段树

    [BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...

  7. 【BZOJ4653】区间,离散化+线段树

    Time:2016.08.09 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 当时打同步赛的时候 花了3h去做T3提答 大概玩了50分 回来看T1竟然是懵逼状态-- 想了一会,满脑 ...

  8. 【bzoj4653】[Noi2016]区间 双指针法+线段树

    题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...

  9. HDU 4553 约会安排 (区间合并)【线段树】

    <题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们 ...

最新文章

  1. (2)Spark下载与入门
  2. C# 获取属性的displayName
  3. 深度学习术语_您应该意识到这些(通用)深度学习术语和术语
  4. iOS 通知中心(NSNotificationCenter)
  5. 聊聊如何设计千万级吞吐量的.Net Core网络通信!
  6. centos7重启网卡命令_重启 CentOS 7 系统后的 IP 地址问题
  7. 如何让用户留在生态系统里?向苹果学习!【转载】
  8. 红帽企业版Linux 6安装指南(中文)
  9. Linux进程的管理与调度(二)-- Linux的命名空间详解
  10. SQL*Plus和iSQL*Plus的区别(oracle)
  11. 内蒙古自治区及其盟市行政单位中英文名称对照表
  12. 如何下载抖音小程序开发工具
  13. 云中漫步-柴米油盐之上
  14. 工欲善其事,必先利其器篇-高效实现右滑退出功能
  15. AspriseOCR图片识别
  16. 移动开发之我见 ——移动WEB
  17. 当我开始爱自己——卓别林
  18. 性能优化:线程快照获取与分析
  19. c语言属于结构化程序设计语言,c语言填空题1.结构化程序设计语言的三种基本结构分别是,和.-查字典问答网...
  20. php 中日期时间函数大全,PHP 中日期时间函数 date() 用法总结

热门文章

  1. delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨
  2. ftp改为sftp_浅谈 FTP、FTPS 与 SFTP
  3. java comparator排序顺序_Java 集合排序策略接口 Comparator
  4. pynput模块—键盘鼠标操作和监听
  5. JAVA多线程实现的三种方式 ()
  6. plsql 中的一些好的设置和快捷键总结
  7. 付忠庆的练习小笔记-Codeforces #277 Div2 C
  8. 将GDB中的输出定向到文件
  9. 三次握手 四次握手 与socket函数的关系
  10. 据悉,深圳某工程师沦为C语言笔试枪手