P4887-[模板]莫队二次离线(第十四分块(前体))

1|0正题

题目链接:https://www.luogu.com.cn/problem/P4887


1|1题目大意

给出一个长度为n的序列am次询问[l,r]求有多少个li<jr满足ai xor aj二进制下恰好有k1

1n,q105,0ai,k<214


1|2解题思路

f(x,i)表示1i中有多少个aax满足条件,假设我们已经知道了区间[l,r]的答案,以[l,r][l,r+1]为例,答案会增加f(r+1,r)f(r+1,l1)f(r+1,r)我们可以直接预处理出每个。

至于f(r+1,l1)我们发现我们的桶和f(x,i)中的i也就是l1有关,在r移动的过程中l1是不变的,所以我们可以将rr+k这个过程离线下来,在指针枚举l1时统一处理。

其他指针的移动一样处理即可。


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long using namespace std; const ll N=1e5+10,L=1<<14,T=316; struct node{ ll l,r,id; }q[N]; ll n,m,k,c[L],v[L],pre[N],a[N],s[N],ans[N]; vector<int> b; vector<node> u[N]; bool cmp(node x,node y) {return (x.l/T==y.l/T)?(x.r<y.r):(x.l/T<y.l/T);} signed main() { scanf("%lld%lld%lld",&n,&m,&k); for(ll i=1;i<L;i++)c[i]=c[i-(i&-i)]+1; for(ll i=0;i<L;i++) if(c[i]==k)b.push_back(i); if(k>14){ for(ll i=1;i<=m;i++) puts("0"); return 0; } for(ll i=1;i<=n;i++)scanf("%lld",&a[i]); for(ll i=1;i<=n;i++){ pre[i]=v[a[i]]; for(ll j=0;j<b.size();j++) v[a[i]^b[j]]++; } for(ll i=1,l,r;i<=m;i++){ scanf("%lld%lld",&q[i].l,&q[i].r); q[i].id=i; } sort(q+1,q+1+m,cmp); ll l=1,r=0; for(ll i=1;i<=m;i++){ if(l<q[i].l)u[r].push_back((node){l,q[i].l-1,-i}); while(l<q[i].l)s[i]+=pre[l],l++; if(l>q[i].l)u[r].push_back((node){q[i].l,l-1,i}); while(l>q[i].l)l--,s[i]-=pre[l]; if(r<q[i].r)u[l-1].push_back((node){r+1,q[i].r,-i}); while(r<q[i].r)r++,s[i]+=pre[r]; if(r>q[i].r)u[l-1].push_back((node){q[i].r+1,r,i}); while(r>q[i].r)s[i]-=pre[r],r--; } memset(v,0,sizeof(v)); for(ll i=1;i<=n;i++){ for(ll j=0;j<b.size();j++) v[a[i]^b[j]]++; for(ll j=0;j<u[i].size();j++){ for(ll x=u[i][j].l;x<=u[i][j].r;x++){ ll tmp=v[a[x]]; if(k==0&&x<=i)tmp--; if(u[i][j].id>0)s[u[i][j].id]+=tmp; else s[-u[i][j].id]-=tmp; } } } for(ll i=1;i<=m;i++) s[i]+=s[i-1],ans[q[i].id]=s[i]; for(ll i=1;i<=m;i++) printf("%lld\n",ans[i]); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16222216.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-05-04 P7581-「RdOI R2」路径权值【长链剖分,dp】
2021-05-04 P4922-[MtOI2018]崩坏3?非酋之战!【dp】
点击右上角即可分享
微信分享提示