题解:[MintOJ19] 悲鸣

题目链接

数据范围很小,所以考虑分块。

因为查询操作是区间的异或和,于是维护序列里每个位置的前缀异或和,查询的时候可以暴力遍历询问位置之前的块内有多少个和他相等的值,值域不大,可以直接开根号个值域大小的桶。

现在就是两种修改操作,个人认为2操作比1操作简单。

2操作可以发现操作区间内 \(l\) 位置开始奇数位置的前缀异或值异或上 \(v\),偶数位置上不变。

这启发我们把奇偶下标独立考虑,分别分块维护,这里只需要打上区间异或的懒标记即可。

如果操作区间长度是偶数,对右边的值无影响,否则右边的值全部异或上 \(v\),也容易用懒标记实现。

1操作复杂一些。

首先考虑区间内,设 \(l-1\) 位置的真实前缀异或值是 \(S1\)\(r\) 位置的真实前缀异或值是 \(S2\),奇数位置变为 \(S1\bigoplus v\),偶数位置变为 \(S1\)

如果区间长度是偶数,右边的值都异或上 \(S1\bigoplus S2\),否则都异或上 \(S1\bigoplus S2\bigoplus v\)

这些细节可以自己在纸上写写,不难推出。

注意讨论覆盖标记和异或标记的优先级即可。

常数较大,所以开了3s。

posted @ 2022-10-19 20:43  Displace  阅读(50)  评论(0)    收藏  举报