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;
}

最新文章

  1. Windows下搭建MySQL Master Slave
  2. .net批量上傳Csv檔資料應用程序開發總結
  3. C#缩放和裁剪图片
  4. InstallShield Custom Dialog
  5. 新Azure 服务仪表盘!
  6. COM简单应用示例
  7. RichTextBox 右键显示 ContextMenuTrip 分类: C# 2014-10-16 10:43 337人阅读 评论(0) 收藏
  8. iOS_SN_百度地图基本使用(1)
  9. Java抽象类深入理解-----模板方法设计模式(Templete Method)
  10. IDAPython: importing “site” failed
  11. VMware workstation创建虚拟机console
  12. swiper 轮播图,拖动之后继续轮播
  13. jvm 启动参数设置(转载)
  14. 【转】使用Chrome Frame,彻底解决浏览器兼容问题
  15. [转]python中@classmethod @staticmethod区别
  16. Java从零开始学十二(构造方法)
  17. Codeforces 932.E Team Work
  18. QString 与中文问题
  19. rtmp聊天相关归总
  20. [C#] Newtonsoft.Json 版本冲突

热门文章

  1. HTML的&lt;Object&gt;标签怎么用?
  2. P1330 封锁阳光大学——深度优先搜索DFS
  3. 深克隆(deepclone)
  4. Go包管理go mod使用
  5. JavaScript动画实例:曲线的绘制
  6. CocosCreator之AssetBundle使用方案分享
  7. js自定义方法绑定元素事件
  8. 日志套餐篇 - log4j2 logback全量套餐
  9. Docker基础使用
  10. Python Ethical Hacking - MAC Address &amp; How to Change(3)