给定一个长 \(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. nginx的四个主要组成部分

    1.nginx二进制可执行文件 · 由各模块源码编译出的一个文件 2.nginx.conf配置文件 · 控制nginx的行为 3.access.log访问日志 . 记录每一条http请求信息 4.er ...

  2. Spring(六)核心容器 - 注册单例 Bean 实例、SingletonBeanRegistry 简介

    前言 上篇文章我们对注册 Bean 的核心类 BeanDefinitionRegistry 进行了讨论,这里的注册 Bean 是指保存 Bean 的相关信息,也就是将 Bean 定义成 BeanDef ...

  3. 如何优雅地使用containerd?这里有一份必读的技巧攻略

    前 言 Docker是我们常用的容器runtime,友好的CLI,丰富的社区资料,外加研发运维人员多年的经验积累,使用Docker几乎是没有任何门槛的事.而k3s为了降低资源消耗,将默认的runtim ...

  4. android webview正确显示音标

    package com.example.fonttest; import android.support.v7.app.ActionBarActivity; import android.webkit ...

  5. Codeforces 977D Divide by three, multiply by two(拓扑排序)

      Polycarp likes to play with numbers. He takes some integer number xx, writes it down on the board, ...

  6. JMeter之If Controller深究一

    1.背景 大家最近还好么,截止目前新型冠状病毒累计确诊病例已超7万4千多例,希望大家无论是在家办公还是单位办公,一定要注意自我防护.今天跟大家分享一下,最近一次真实生产压测遇到的问题,如题:if co ...

  7. idea快速创建一个类 实现一个接口

    一 创建一个接口类 二  点击接口名称 按alt + ent 三 选择implement interface 选项 完美!!!!!!!

  8. pytorch之 RNN classifier

    import torch from torch import nn import torchvision.datasets as dsets import torchvision.transforms ...

  9. coat 彩色的cat

    # 和cat类似,但每一行一种颜色,方便查看 curl -o coat https://raw.githubusercontent.com/oldratlee/useful-scripts/maste ...

  10. [WPF 自定义控件]在MenuItem上使用RadioButton

    1. 需求 上图这种包含多选(CheckBox)和单选(RadioButton)的菜单十分常见,可是在WPF中只提供了多选的MenuItem.顺便一提,要使MenuItem可以多选,只需要将MenuI ...