给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\)

有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\sum_{i=l}^r f(i \ xor\ x)^2\)

Solution

定义 \(S*x={y \ xor \ x|y \in S}\),\((x)_i\) 表示 \(x\) 第 \(i\) 位的值,则所求为 \(\sum_{y\in[L,R]*x} f^2(y)\),差分一下,只需要求 \(\sum_{y\in[0,R]*x} f^2(y)\)

手玩一下可以想到, \([0,R]*x\) 一定能被划分为 \(O(\log n)\) 个连续的区间

考虑第 \(w\) 位

  • 如果 \(R<2^w\),若 \((x)_w=0\) 则变为 \([0,R]*x'\),若 \((x)_w=1\) 则变为 \([2^w,2^w+R]*x'\),其中\(x'=x \& (2^w-1)\)

  • 如果 \(R\geq 2^w\),若 \((x)_w=0\) 则变为 \([0,2^w-1] + [2^w,R]*x'\),后者递归下去即可;若 \((x)_w=1\) 则变为 \([2^w,2^{w+1}-1] + [0,R-2^w]*x'\),后者同样递归做下去

如果我们能快速完成这种划分,那么问题转化为求 \(g(R)=\sum_{x\leq R} f^2(x)\),考虑到这个函数是个分段线性函数,不妨假设 \(a_i\) 已经排序,我们只需要预处理出序列 \(g(a_1),g(a_2),\dots, g(a_n)\),那么询问时拿着 \(R\) 在 \(a\) 序列上二分一下,就可以很容易算出答案。

#include <bits/stdc++.h>
using namespace std; #define int long long
const int N = 100005;
const int mod = 998244353; struct range{int l,r;}; vector<range> xorrange(int r,int x) {
vector <range> v;
v.push_back({r^x,r^x});
int offset=0;
for(int i=30;i>=0;--i) {
if(r<(1<<i)) {
if(x&(1<<i)) {
offset+=(1<<i);
}
}
else {
if(x&(1<<i)) {
v.push_back({(1<<i)+offset,(1<<(i+1))-1+offset});
r^=(1<<i);
}
else {
v.push_back({offset,(1<<i)-1+offset});
r^=(1<<i);
offset+=(1<<i);
}
}
x&=(1<<i)-1;
}
return v;
} int n,q,a[N],f[N],g[N]; int calc(int x) {
int p = upper_bound(a+1,a+n+1,x) - a-1;
return (g[p] + (x-a[p])*p*p) % mod;
} int gen(int p,int x) {
vector<range> v=xorrange(p,x);
int ans=0;
for(int i=0;i<v.size();i++) ans+=(calc(v[i].r)-calc(v[i].l-1)+mod)%mod,ans%=mod;
return ans;
} signed main() {
ios::sync_with_stdio(false);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) g[i]=(g[i-1]+(i-1)*(i-1)%mod*(a[i]-a[i-1]-1)+i*i)%mod;
for(int i=1;i<=q;i++) {
int l,r,x;
cin>>l>>r>>x;
cout<<(gen(r,x)-gen(l-1,x)+mod)%mod<<endl;
}
}

最新文章

  1. C#进阶系列——WebApi 跨域问题解决方案:CORS
  2. 查询SqlServer中每张表的记录数
  3. 利用QMP和QEMU虚拟机交互的几种方式
  4. list使用例子(转)
  5. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
  6. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)
  7. Spring 事务模型
  8. (转)解读Flash矩阵
  9. 都说ConcurrentDictionary&lt;TKey, TValue&gt;有陷阱
  10. Android使用开源框架加载图片
  11. 再学习sqlhelper
  12. 用Python实现gmail邮箱服务,实现两个邮箱之间的绑定(中)
  13. Linux Select之坑
  14. Swift基础之Delegate方法的使用
  15. Winform 窗体获得焦点
  16. Pilosa文档翻译(三)示例
  17. PKUWC 2019 记
  18. mysql集成部署
  19. vue中创建全局单文件组件/命令
  20. 从url到请求 再到页面生成

热门文章

  1. LUA学习笔记(第1-4章)
  2. Codeforces_734_D
  3. CCF_ 201312-2_ISBN号码
  4. jsp关于request.setAttribue还有response.addCookie()的两个问题
  5. STM32片外SRAM作运行内存
  6. Spring IOC容器源码分析
  7. USBWebServer - 在U盘里搭一个Web服务器!
  8. STP 生成树协议 RSTP 快速生成树
  9. 隐藏Web Shell
  10. centos7安装node.js