标签:10 le 记录 23 bmod 树状 ge 异或 2022.7
Luogu3760 TJOI2017 异或和 Future 7.5
给定长为 \(n\) 的序列 \(a\),求其所有子区间和的异或值。\(1\le n\le 10^5,1\le \sum a_i\le 10^6\)。
一眼看过去不太会做,瞄了眼标签发现是「树状数组」突然就会了......
考虑算出来前缀和 \(S_i=\sum_{j=1}^ia_j\),那么区间和就是 \(S_i-S_{j-1}\),并且 \(1\le S_i\le 10^6\)。
然后我们枚举 \(S_i\),考虑算 \(\bigoplus_{j=0}^{i-1}(S_i-S_j)\),其中 \(\oplus\) 表示异或。
考虑枚举第 \(r\) 位,算出来有多少 \(S_i-S_j\) 第 \(r\) 位为 \(1\)。
注意到,一个数 \(x\) 的第 \(r\) 位为 \(1\),相当于 \(x\bmod 2^{r+1}\ge 2^r\)。
我们考虑开 \(O(\log V)\) 个树状数组,第 \(r\) 个树状数组里面存所有 \(S_j\bmod 2^{r+1}\) 的值,分类讨论一下:
- 对于 \(S_j\bmod 2^{r+1}\le S_i\bmod 2^{r+1}\) 的 \(j\),需要有 \(S_i\bmod 2^{r+1}-2^r\ge S_j\bmod 2^{r+1}\)。
- 对于 \(S_j\bmod 2^{r+1}>S_i\bmod 2^{r+1}\) 的 \(j\),需要有 \(S_i\bmod 2^{r+1}+2^{r}\ge S_j\bmod 2^{r+1}\)。
用树状数组维护单点加与区间和即可。时间复杂度 \(O(n\log^2 V)\)。AC Code
然后你发现其实只需要算出来 \(c_i\) 表示区间和为 \(i\) 的区间个数,这个可以直接 FFT 于是 1log 做法就有啦
晚上打了场 abc,见 AtCoder Beginner Contest 261 (C~F)
标签:10,le,记录,23,bmod,树状,ge,异或,2022.7 来源: https://www.cnblogs.com/YunQianQwQ/p/16513163.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。