莫队&分块模版

区间查询优化技巧
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+5;


int pos[maxn],SIZE;
int n,m,k,b[maxn],l,r;
LL tot,cnt[maxn],res,ANS[maxn],ans;


struct Quiry
{
int l,r,id;
}a[maxn];


inline void add(int r1,int r2,int i){a[++tot]=(Quiry){r1,r2,i};}
inline bool cmp(const Quiry&A,const Quiry&B){return pos[A.l]<pos[B.l]||(pos[A.l]==pos[B.l]&&A.r<B.r);}
inline void Del(int x)
{
--cnt[b[x]];
ans-=cnt[b[x]^k];
}
inline void Ins(int x)
{
ans+=cnt[b[x]^k];
++cnt[b[x]];
}
int main()
{
  while(~scanf("%d%d%d",&n,&m,&k))
  {
  memset(cnt,0,sizeof(cnt)); 


for(int i=1;i<=n;++i)scanf("%d",b+i);
SIZE=floor(sqrt(1.0*n)+0.5);
for(int i=1;i<=n;++i)pos[i]=(i-1)/SIZE+1;
tot=0;
for(int i=1;i<=m;++i)
{
scanf("%d%d",&l,&r);
add(l,r,i);
}
sort(a+1,a+1+tot,cmp);
int L=1,R=0;
ans=0;
cnt[0]=1;
for(int i=1;i<=tot;++i)
{
int l=a[i].l,r=a[i].r;
while(L<l)Del(L),++L;
while(L>l)--L,Ins(L);
while(R<r)++R,Ins(R);
while(R>r)Del(R),--R;
ANS[a[i].id]=ans;
}
for(int i=1;i<=m;++i)printf("%lld\n",ANS[i]);
  }
  return 0;
}

转载于:https://www.cnblogs.com/songorz/p/9386598.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值