0%

ITMO Academy pilot course » Segment Tree, part 1 » Step 1 » Practice(ITMO 线段树部分一,第1步的练习,单点修改线段树)

题目一(普通的单点修改、区间和查询线段树)

题目描述

需要编写一个标准的线段树来维护数组的区间和,支持单点修改和区间求和操作。

输入格式

第一行包含两个整数 nnmm (1n,m1000001 \le n, m \le 100000),分别表示数组的大小和操作的次数。
第二行包含 nn 个整数 aia_i,表示数组的初始状态 (0ai1090 \le a_i \le 10^9)。
接下来的行包含操作的描述。每个操作的描述如下:

  • 1 i v:将索引为 ii 的元素设置为 vv (0i<n0 \le i < n, 0v1090 \le v \le 10^9)。

  • 2 l r:计算索引从 llr1r-1 的元素之和 (0l<rn0 \le l < r \le n)。

输出格式

对于每个第二种类型的操作,打印对应的和。

样例输入

1
2
3
4
5
6
7
5 5
5 4 2 3 5
2 0 3
1 1 1
2 0 3
1 3 1
2 0 5

样例输出

1
2
3
11
8
14

样例解释

初始数组为 [5, 4, 2, 3, 5](注意题目中下标从 0 开始)。

  1. 操作 2 0 3:计算下标 [0,3)[0, 3)0,1,20, 1, 2 的和。5+4+2=115 + 4 + 2 = 11

  2. 操作 1 1 1:将下标为 1 的元素修改为 1。数组变为 [5, 1, 2, 3, 5]

  3. 操作 2 0 3:再次计算下标 [0,3)[0, 3) 的和。5+1+2=85 + 1 + 2 = 8

  4. 操作 1 3 1:将下标为 3 的元素修改为 1。数组变为 [5, 1, 2, 1, 5]

  5. 操作 2 0 5:计算下标 [0,5)[0, 5) 即整个数组的和。5+1+2+1+5=145 + 1 + 2 + 1 + 5 = 14

AC
https://codeforces.com/edu/course/2/lesson/4/1/practice/contest/273169/submission/363403398

题目 2(单点修改,区间最小值查询线段树)

引入了这个泛型设计。就是假如以后可能有多个 info 的话,可以使用自动模板推导。

AC
https://codeforces.com/edu/course/2/lesson/4/1/practice/contest/273169/submission/363486196

题目3(单点修改、区间最小值查询以及区间最小值个数查询线段树)

只需要设计一个新的 merge 函数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static Info merge(const Info &a, const Info &b) {
Info res;
res.l=a.l;
res.r=b.r;
res.mn=min(a.mn,b.mn);
if (a.mn==b.mn) {
res.cnt=a.cnt+b.cnt;
}else if (a.mn<b.mn) {
res.cnt=a.cnt;
}else {
res.cnt=b.cnt;
}
return res;
}

AC
https://codeforces.com/edu/course/2/lesson/4/1/practice/contest/273169/submission/363488027