- 个人训练情况
新生训练mission 7——线段树与树状数组已完成8题(共十题)
Stat | # | Title | |
---|---|---|---|
Solved | 14 / 17 | A | Frequent values |
Solved | 23 / 34 | B | 敌兵布阵 |
Solved | 20 / 31 | C | I Hate It |
Solved | 17 / 30 | D | Just a Hook |
Solved | 13 / 34 | E | Count the Colors |
Solved | 9 / 20 | F | Can you answer these queries? |
Solved | 14 / 36 | G | A Simple Problem with Integers |
10 / 11 | H | Help with Intervals | |
7 / 7 | I | Cows | |
Solved | 3 / 8 | J | Can you answer these queries I |
- 遇到的问题&解决方法
1.第一题“Frequent values”采用ST算法(Sparse Table),其原理为动态规划(难点): d[i, j]=max(d[i, j-1],d[i+2^(j-1), j-1])
其中d[i, j]表示从i开始,长度为的一段数组区间内元素的最大值,初始化时d[i,0]分别赋每个元素的值,递推时j从1开始到
<=区间元素个数;对每个j,i从0开始到i+
<区间元素个数.
2.之后多题采用线段树,主要操作包括点修改,区间内元素增加相同值,区间内元素改为相同值,查询区间和或最大值,统计特定元素段个数。有点难懂。。
3.第二题“敌兵布阵”和第三题“I Hate It”要求点修改,可遍历至叶节点修改后返回,逐层修改非叶节点至根节点
4.第四题“Just a Hook”要求区间改为相同值,采用懒标记只修改不重合最大区间的值,查询时再下传标记。
5.第五题“Count the Colors”同第四题,区别在于最后一次性下传标记完成统计。
6.第六题“Can you answer these queries?”单点开根,每个点小于,所以7次开根必为1,此后无需更新。
7.第七题“A Simple Problem with Integers”区间增加相同值,依旧用懒标记,下传标记时默认int型可能溢出,应强制转换为long long型或懒标记数组直接用long long型。。
tree[a]+=(long long)(mid-l+1)*f[o];
tree[b]+=(long long)(r-mid)*f[o];
8.第十题“Can you answer these queries I”查询每一个区间的最大连续和,建树时每个节点储存该区间的最大连续和,最大前缀和,最大后缀和,区间值之和。其中最大连续和=max(左子节点最大连续和,右子节点最大连续和,左子节点最大后缀和+右子节点最大前缀和)。查询时至上而下遍历线段树,对每个节点都有四种情况:刚好是查询区间的子区间(直接返回该节点信息),左子节点包括查询区间的子区间(遍历左子节点),右子节点包括查询区间的子区间(遍历右子节点),查询区间的子区间同时在左子节点和右子节点中(左右都遍历)。合并区间过程类似建树过程。。对查询区间的每个子区间合并完成即可得到最大连续和。