给定一个长 \(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;
}
}

Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分的更多相关文章

  1. Wannafly Winter Camp 2020 Day 5J Xor on Figures - 线性基,bitset

    有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置 ...

  2. Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学

    神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...

  3. Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学

    于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...

  4. Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组

    给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...

  5. Wannafly Winter Camp 2020 Day 6J K重排列 - dp

    求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...

  6. Wannafly Winter Camp 2020 Day 6I 变大! - dp

    给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...

  7. Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心

    对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...

  8. Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学

    给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...

  9. Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心

    你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...

随机推荐

  1. Spring注入bean的方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的se ...

  2. A Simple Introduction To Computer Networking

    Most networking discussions are a jumble of acronyms. Forget the configuration details - what are th ...

  3. 关于PreparedStatement.addBatch()方法

    Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接,(打电话拨号 ) Connec ...

  4. MySQL初次安装配置及修改密码

    安装前的准备工作: 下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\mysql-8.0.11 下. 接下来我们需要配置下 MySQL 的配置文件 打开刚刚解压的文件夹 ...

  5. SQL Server 2012 安装完成后,无法通过 sa账号登录

    1.打开 SQL server  configuration manager 2.打开 SQLserver 网络配置 打开 SQLSERVER的协议 3.右击 TCP/IP协议,选择 IPALL ,在 ...

  6. springboot整合druid和配置资源监控

    1.添加依赖,在maven repository中搜索 <dependency> <groupId>com.alibaba</groupId> <artifa ...

  7. 详解c++中对二维数组下标[][]的重载

    首先定义一个矩阵类,我用一个二维数组存储矩阵中的数据,矩阵详细定义如下 class Matrix { public: Matrix(int rows, int cols) { _rows = rows ...

  8. python上获得随机字符

    import random import string print(string.ascii_letters) # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO ...

  9. Ts环境搭建

    一.ts环境搭建 安装node.js,用dos命令npm全局安装typescripe包环境 进入vscode官网下载zip文件解压后使用code.exe

  10. 使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...