luogu P4887 模板 莫队二次离线 莫队 离线
LINK:模板莫队二次离线
很早以前学的知识点 不过 很久了忘了。
考虑暴力 :每次莫队更新的时候 尝试更新一个点到一个区间的答案 可以枚举二进制下位数为k的数字 看一下区间内的这种数字有多少个。
不过这样每次移动的复杂度为 C(14,k)的。
考虑 将每次移动操作进行离线 答案进行差分。
那么只需要求出指针移动的变换量即可 由于左端点和右端点的变换量都是nsqrt(n)的
如果直接开空间这么存 空间复杂度nsqrt(n).吃不消。
考虑将一个f(L,[L+1,R])的这种形式的贡献进行前后差分 f(L,1~R)-f(L,[1,L-1]).
这样每次存的都是连续的一堆 离线下来的东西也可以前缀和的时候做 前一步nsqrt(n)。
后一步进行扫描线 nk+nsqrt(n).
很妙的算法。
const int MAXN=100010;
int n,m,k,B,maxx;
int a[MAXN],sum[MAXN],pre[MAXN],v[MAXN];ll ans[MAXN],cc[MAXN];
struct wy{int l,r,id;}t[MAXN];
vector<wy>g[MAXN];
vector<int>p;
inline int cmp(wy a,wy b){return v[a.l]==v[b.l]?a.r<b.r:a.l<b.l;}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);get(k);
if(k>14)
{
rep(1,m,i)puts("0");
return 0;
}
maxx=16383;
rep(0,maxx,i)
{
sum[i]=sum[i>>1]+(i&1);
if(sum[i]==k)p.pb(i);
}
rep(0,maxx,i)sum[i]=0;
B=(int)sqrt(n*1.0);
rep(1,n,i)
{
get(a[i]);v[i]=(i-1)/B+1;
pre[i-1]=sum[a[i]];
vep(0,p.size(),j)++sum[a[i]^p[j]];
}
rep(1,m,i)t[i]=(wy){read(),read(),i};
sort(t+1,t+1+m,cmp);
int L=1,R=0;
rep(1,m,i)
{
if(L<t[i].l)g[R].pb((wy){L,t[i].l-1,-i});
while(L<t[i].l){ans[i]+=pre[L-1];++L;}
if(L>t[i].l)g[R].pb((wy){t[i].l,L-1,i});
while(L>t[i].l){--L;ans[i]-=pre[L-1];}
if(R<t[i].r)g[L-1].pb((wy){R+1,t[i].r,-i});
while(R<t[i].r){ans[i]+=pre[R];++R;}
if(R>t[i].r)g[L-1].pb((wy){t[i].r+1,R,i});
while(R>t[i].r){ans[i]-=pre[R-1];--R;}
}
rep(0,maxx,i)sum[i]=0;
rep(1,n,i)
{
vep(0,p.size(),j)++sum[a[i]^p[j]];
vep(0,g[i].size(),j)
{
int l=g[i][j].l;int r=g[i][j].r;
int id=g[i][j].id;
rep(l,r,w)
{
int ww=sum[a[w]];
if(k==0&&w<=i)--ww;
if(id<0)ans[-id]-=ww;
else ans[id]+=ww;
}
}
}
rep(1,m,i)ans[i]+=ans[i-1],cc[t[i].id]=ans[i];
rep(1,m,i)putl(cc[i]);
return 0;
}
luogu P4887 模板 莫队二次离线 莫队 离线的更多相关文章
- luogu P4887 莫队二次离线
珂朵莉给了你一个序列$a$,每次查询给一个区间$[l,r]$ 查询$l≤i<j≤r$,且$ai⊕aj$的二进制表示下有$k$个$1$的二元组$(i,j)$的个数.$⊕$是指按位异或. 直接暴力莫 ...
- 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)
题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...
- 洛谷P5398 [Ynoi2018]GOSICK(二次离线莫队)
题面 传送门 题解 维包一生推 首先请确保您会二次离线莫队 那么我们现在的问题就是怎么转移了,对于\(i\)和前缀\([1,r]\)的贡献,我们拆成\(b_i\)和\(c_i\)两部分,其中\(b_i ...
- Luogu P2742 模板-二维凸包
Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...
- D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;
D. Powerful array time limit per test seconds memory limit per test megabytes input standard input o ...
- LUOGU P4074 [WC2013]糖果公园 (树上带修莫队)
传送门 解题思路 树上带修莫队,搞了两天..终于开O2+卡常大法贴边过了...bzoj上跑了183s..其实就是把树上莫队和带修莫队结合到一起,首先求出括号序,就是进一次出一次那种的,然后如果求两个点 ...
- [luogu P3384] [模板]树链剖分
[luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...
- 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式
按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式 之前写过一篇文章<按照已有的模板输出一(如发票)>,是关于如何给已有的模板赋值.在项目的实践过程 ...
随机推荐
- Html中a标签用法总结:创建email,电话,描点链接等。以及防止链接被搜索引擎收录
<a>标签可以用来创建一个到其他网页.文件.同一页面内的位置.电子邮件地址或任何其他URL的超链接. 是我们常用的一个标签之一,今天就讲讲如何使用a来创建email,电话,描点链接等.以 ...
- Subset POJ - 3977(折半枚举+二分查找)
题目描述 Given a list of N integers with absolute values no larger than 10 15, find a non empty subset o ...
- 小师妹学JVM之:Dirty cards和PLAB
目录 简介 分代收集器中的空间划分 Write barrier和Dirty cards PLAB old space分配对象 总结 简介 分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有 ...
- Linux超强截图工具flameshot
Pop!_OS自带的截屏快捷键如下 但讲道理这个是真的不好用 所以我们借助第三方的截图工具,这里推荐flameshot(火焰截图) 在终端键入以下命令即可安装 sudo apt update sudo ...
- python eval函数,将列表样式的字符串转化为列表
python eval函数,将列表样式的字符串转化为列表 >>> str_1 = '[1,2,3,4,5,6]'>>> type(str_1)<type 's ...
- 数据可视化之powerBI入门(九)PowerBI数据建模:其实一点都不高深
https://zhuanlan.zhihu.com/p/64149834 数据建模并没有那么高深,你同样可以学会!这篇文章通过一个实例创建一个简单的数据建模,并引出两个重要的概念:度量值和DAX. ...
- 数据可视化之powerBI技巧(四)使用Power BI制作帕累托图
各种复杂现象的背后,其实都是受关键的少数因素和普通的大多数因素所影响,把主要精力放在关键的少数因素上,就能达到事半功倍的效果. 这就是大家常说的二八原则,也称为帕累托原则,最早是由意大利经济学家 V. ...
- python 生成器(二):生成器基础(二)惰性实现
简介 设计 Iterator 接口时考虑到了惰性:next(my_iterator) 一次生成一个元素.懒惰的反义词是急迫,其实,惰性求值(lazy evaluation)和及早求值(eager ev ...
- Unity3D+Post Processing Stack V2自定义后处理效果研究
背景 众所周知,Unity3D支持自定义后处理效果,实现过程有三步: 添加着色器,在着色器里书写后处理代码: 添加材质,把材质和着色器绑定: 给相机添加脚本,重写其OnRenderImage方法,将材 ...
- Go的100天之旅-01初识Go
初识Go Go简介 Go的历史 上个世纪70年代Ken Thompson和Dennis M. Ritchie合作发明了UNIX操作系统同时Dennis M. Ritchie发明了C语言. 2007年的 ...