本文出自blog.csdn.net/svitter
——我大C++的指针岂是尔等能够简单领悟!
题意
- 给N个节点,标号A1~An,然后有Q个操作,操作分为Q i j,查询i,j间的区间和。C i j k,i到j个数字,每个数字增加k,并且输出。
输入输出分析
给N,Q,然后跟操作。注意判断Q,C使用scanf("%s")。
测试数据:
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
算法数据结构分析
线段树基础题目,但是在其上添加了区间加和操作,增加了难度。 如果每个节点直接更新肯定是不行的,可以保存sum,inc(增量)来进行计算。 如果区间正好对应,那么将this.inc += inc。如果区间不是直接对应的,那么sum值增加inc×增加的个数。 之后在进行查询的同时,如果inc的值不是0,可以代入到下一层的inc中,本sum += inc×节点个数。
AC代码:
处理指针的时候出现了些问题,没有写L == R的情况溢出。还有就是r <= mid的情况也没有留意,也造成溢出问题。
最后的问题就是sum一开始忘记inc×个数,直接导致多次WA。
还有就是i从1开始,树状数组也是。
//author: svtter
//
#include
#include
#include
#include
#include