思路
对于每个位置的宝石,分别维护
p
r
e
[
i
]
pre[i]
pre[i](同色前一宝石所在位置)和
n
x
t
[
i
]
nxt[i]
nxt[i](同色后一宝石所在位置)。
注意到
k
k
k很小,那么对于每次询问,我们可以从开始点往后找,查询当前点是否有同色点位于前面且位于
[
s
,
n
]
[s,n]
[s,n]内,有的话比较大小,决定是否跳过。
对于区间单点维护操作,我们需要对
p
r
e
pre
pre和
n
x
t
nxt
nxt进行更新,更新的过程类似于单链表,每个颜色单独构成一条链:
- 删除原有元素(讨论:元素位于序列头部、尾部、中间)。
- 添加新元素(讨论头插、尾插、中插)
为了更快的查找插入元素的位置,我们可以对每个颜色维护一个std::set,然后通过二分查找找位置插入。
对于查询操作和求和操作,显然可以使用线段树进行加速。我们对宝石的值维护一个区间和线段树,对每个点的 p r e pre pre节点维护一个区间最大值线段树,当最大值为 − 1 -1 −1时就表示区间内无重复颜色。如果查询到一段区间无重复颜色,显然可以直接选择整个区间。对于有重复颜色的区间,我们在线段树上二分查找有重复颜色节点的下一节点,并根据值的大小决定是否进行更新即可。
#include
#define int long long
const int N = 2e5 + 10;
int c[N], v[N];
int pre[N], nxt[N], last[N], his[N];
namespace SegmentTree{
int tree[N
关注
打赏
- 回坑记之或许是退役赛季?
- [LCT刷题] P1501 [国家集训队]Tree II
- [LCT刷题] P2147 洞穴勘测
- 2022-2023 ICPC Brazil Subregional Programming Contest VP记录
- [线段树套单调栈] 2019-2020 ICPC Asia Hong Kong Regional Contest H.[Hold the Line]
- The 2021 ICPC Asia Nanjing Regional Contest E.Paimon Segment Tree 区间合并线段树/维护矩阵乘法
- CF580E - Kefa and Watch 线段树维护哈希
- HDU5869 Different GCD Subarray Query 离线查询/区间贡献
- 27.CF1004F Sonya and Bitwise OR 区间合并线段树
- 26.CF1000F One Occurrence
