Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分
给定一个长 \(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 异或询问 - 二分的更多相关文章
- 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\) 的任一位置 ...
- Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...
- Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学
于是去弄了个板子来 #include <bits/stdc++.h> using namespace std; #define int long long const int mod = ...
- Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组
给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...
- Wannafly Winter Camp 2020 Day 6J K重排列 - dp
求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...
- Wannafly Winter Camp 2020 Day 6I 变大! - dp
给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...
- Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...
- Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学
给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...
- Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心
你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...
随机推荐
- nginx的四个主要组成部分
1.nginx二进制可执行文件 · 由各模块源码编译出的一个文件 2.nginx.conf配置文件 · 控制nginx的行为 3.access.log访问日志 . 记录每一条http请求信息 4.er ...
- Spring(六)核心容器 - 注册单例 Bean 实例、SingletonBeanRegistry 简介
前言 上篇文章我们对注册 Bean 的核心类 BeanDefinitionRegistry 进行了讨论,这里的注册 Bean 是指保存 Bean 的相关信息,也就是将 Bean 定义成 BeanDef ...
- 如何优雅地使用containerd?这里有一份必读的技巧攻略
前 言 Docker是我们常用的容器runtime,友好的CLI,丰富的社区资料,外加研发运维人员多年的经验积累,使用Docker几乎是没有任何门槛的事.而k3s为了降低资源消耗,将默认的runtim ...
- android webview正确显示音标
package com.example.fonttest; import android.support.v7.app.ActionBarActivity; import android.webkit ...
- 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, ...
- JMeter之If Controller深究一
1.背景 大家最近还好么,截止目前新型冠状病毒累计确诊病例已超7万4千多例,希望大家无论是在家办公还是单位办公,一定要注意自我防护.今天跟大家分享一下,最近一次真实生产压测遇到的问题,如题:if co ...
- idea快速创建一个类 实现一个接口
一 创建一个接口类 二 点击接口名称 按alt + ent 三 选择implement interface 选项 完美!!!!!!!
- pytorch之 RNN classifier
import torch from torch import nn import torchvision.datasets as dsets import torchvision.transforms ...
- coat 彩色的cat
# 和cat类似,但每一行一种颜色,方便查看 curl -o coat https://raw.githubusercontent.com/oldratlee/useful-scripts/maste ...
- [WPF 自定义控件]在MenuItem上使用RadioButton
1. 需求 上图这种包含多选(CheckBox)和单选(RadioButton)的菜单十分常见,可是在WPF中只提供了多选的MenuItem.顺便一提,要使MenuItem可以多选,只需要将MenuI ...