sto \(lxl\) orz

考虑莫队,每次移动端点,我们都要询问区间内和当前数字异或有 \(k\) 个 \(1\) 的数字个数

询问 \([l,r]\) 可以再次离线,拆成询问 \([1,l-1]\) 和 \([l,r]\)

然后考虑莫队要移动 \([l,r]\) 的 \(l\) 到 \(p\)

假设 \(p>l\)

那么相当于每次询问 \(a[l]\) 和 \([l+1,r]\),然后 \(++l\) 直到 \(l=p\)

即每次询问 \(a[l]\) 和 \([1,l]\) ,\(a[l]\) 和 \([1,r]\)

对于前面的部分,它每次都是前缀区间的最后一个数字询问前缀区间,可以预处理

对于后面的部分,它每次都是一个数字询问一个固定的区间,直接在 \(r\) 处打上一个询问 \(l,p\) 的标记,之后离线暴力询问 \(l,p\),这一部分复杂度和莫队一样

然后其它移动端点的方法类似

大力讨论一下即可

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. namespace IO {
  5. const int maxn(1 << 21 | 1);
  6. char ibuf[maxn], *iS, *iT, c;
  7. int f;
  8. inline char Getc() {
  9. return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++;
  10. }
  11. template <class Int> inline void In(Int &x) {
  12. for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
  13. for (x = 0; c >= '0' && c <= '9'; c = Getc()) x = x * 10 + (c ^ 48);
  14. x *= f;
  15. }
  16. }
  17. using IO :: In;
  18. const int maxn(2e5 + 5);
  19. int cnt, v[maxn], n, m, k, a[maxn], sum[maxn], blo;
  20. ll cur, ret[maxn], ans[maxn], pre1[maxn], pre2[maxn];
  21. struct Qry {
  22. int l, r, id;
  23. inline bool operator < (Qry b) const {
  24. return l / blo != b.l / blo ? l < b.l : r < b.r;
  25. }
  26. } qry[maxn];
  27. vector <Qry> q[maxn];
  28. # define pk push_back
  29. int main() {
  30. In(n), In(m), In(k), blo = sqrt(n);
  31. for (int i = 0; i < 16384; ++i) {
  32. int x = i, c = 0;
  33. for (; x; x ^= x & -x) ++c;
  34. if (c == k) v[++cnt] = i;
  35. }
  36. for (int i = 1; i <= n; ++i) In(a[i]);
  37. for (int i = 1; i <= m; ++i) In(qry[i].l), In(qry[i].r), qry[i].id = i;
  38. sort(qry + 1, qry + m + 1);
  39. for (int i = 1, l = qry[1].r + 1, r = qry[1].r; i <= m; ++i) {
  40. if (l < qry[i].l) q[r].pk((Qry){l, qry[i].l - 1, qry[i].id << 1});
  41. else if (l > qry[i].l) q[r].pk((Qry){qry[i].l, l - 1, qry[i].id << 1});
  42. l = qry[i].l;
  43. if (r < qry[i].r) q[l - 1].pk((Qry){r + 1, qry[i].r, qry[i].id << 1 | 1});
  44. else if (r > qry[i].r) q[l - 1].pk((Qry){qry[i].r + 1, r, qry[i].id << 1 | 1});
  45. r = qry[i].r;
  46. }
  47. for (int i = 1; i <= n; ++i) {
  48. pre1[i] = pre1[i - 1] + sum[a[i]];
  49. for (int j = 1; j <= cnt; ++j) ++sum[a[i] ^ v[j]];
  50. pre2[i] = pre2[i - 1] + sum[a[i]];
  51. for (auto t : q[i]) for (int j = t.l; j <= t.r; ++j) ret[t.id] += sum[a[j]];
  52. }
  53. for (int i = 1, l = qry[1].r + 1, r = qry[1].r; i <= m; ++i) {
  54. if (l < qry[i].l) cur += pre2[qry[i].l - 1] - pre2[l - 1] - ret[qry[i].id << 1];
  55. else if (l > qry[i].l) cur += ret[qry[i].id << 1] - pre2[l - 1] + pre2[qry[i].l - 1];
  56. l = qry[i].l;
  57. if (r < qry[i].r) cur += pre1[qry[i].r] - pre1[r] - ret[qry[i].id << 1 | 1];
  58. else if (r > qry[i].r) cur += ret[qry[i].id << 1 | 1] - pre1[r] + pre1[qry[i].r];
  59. ans[qry[i].id] = cur, r = qry[i].r;
  60. }
  61. for (int i = 1; i <= m; ++i) printf("%lld\n", ans[i]);
  62. return 0;
  63. }

Luogu4887 第十四分块(前体)的更多相关文章

  1. P4887 第十四分块(前体) 莫队

    题意: 给你一个序列,每次询问l,r问多少个a[i]^a[j]有k个1,k固定. 序列长度1e5,a[i]<=2^14 时限1s,空间40M 题解: 个人其实开始没什么思路,看了题解也好久,题解 ...

  2. 洛谷P4887 第十四分块(前体)(二次离线莫队)

    题面 传送门 题解 lxl大毒瘤 我们考虑莫队,在移动端点的时候相当于我们需要快速计算一个区间内和当前数字异或和中\(1\)的个数为\(k\)的数有几个,而这个显然是可以差分的,也就是\([l,r]\ ...

  3. [洛谷P4887]第十四分块(前体)

    题目大意: 给定一个长度为\(n\)的序列\(a\),\(k\),和\(m\)次询问. 每次询问给定区间\([l,r]\),求满足\(l\leqslant i< j\leqslant r\)且\ ...

  4. 【LuoguP4887】第十四分块(前体)

    题目链接 题意 区间两数异或在二进制下有 \(k\) 个 \(1\) 的对数. Sol 普通莫队的话,如果要实时维护好区间内的答案需要支持区间对一个数求答案. 直接做不是很好做,容易发现其实这也就是一 ...

  5. 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)

    题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...

  6. 「kuangbin带你飞」专题十四 数论基础

    layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...

  7. Alink漫谈(十四) :多层感知机 之 总体架构

    Alink漫谈(十四) :多层感知机 之 总体架构 目录 Alink漫谈(十四) :多层感知机 之 总体架构 0x00 摘要 0x01 背景概念 1.1 前馈神经网络 1.2 反向传播 1.3 代价函 ...

  8. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  9. 雅虎(yahoo)前端优化十四条军规

    第一条.尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests ) http请求是要开销的,想办法减少请求数自然可以提高网页速度.常用的方法,合并css,js(将一个页面 ...

随机推荐

  1. unittest测试框架和测试报告的输出实例(一)

    我们整个自动化才是报告的环节基本上分为三个部分: 1.测试用例的准备 2.测试用例的执行 3.测试报告的输出 1.测试用例的准备: 那我们就以搜孤网页做一个简单的用例: from selenium i ...

  2. 多并发编程基础 之进程 Process

    原贴  https://www.cnblogs.com/gbq-dog/p/10299663.html 1. 进程的理论知识 1.1 操作系统的背景知识 顾名思义,进程即正在执行的一个过程.进程是对正 ...

  3. CentOS下安装Docker

    简介:本篇文章介绍如何在CentOS系统下面安装docker系统. 官方文档:https://docs.docker.com/install/linux/docker-ce/centos/ Docke ...

  4. KCF+Opencv3.0+Cmake+Win10

    配置 需要的文件下载 安装CMake,安装opencv3.0.0 在KCFcpp-master 目录下新建一个文件夹,命名为build 打开CMake-GUI配置如下: 点击Configure,编译器 ...

  5. ArcGis10.2破解教程

    ArcGis10.2下载地址: https://pan.baidu.com/s/15s5ki_8gf0_732br6h43Hw 破解步骤: 1.完成License Manager的安装. 2.将破解文 ...

  6. UI1

    计算机工程系     目 录   实验一 Photoshop基本界面熟悉 3 实验二 PhotoShop常用工具的使用 4 实验三 图象和图层的处理 7 实验四 各种滤镜方式的处理 13 实验五 Ph ...

  7. 搭建django环境

    一.安装django(两种方式) 1.pip install django 2.python setup.py install(下载gjango包:https://www.djangoproject. ...

  8. STM32F103RE引脚功能整理

  9. 微信 oauth 登录 ,回调两次,一个坑,记录一下。

    在做微信某个功能的时候,大致需求是:静默授权,得到openId ,然后拿着openId调用接口,判断是否关注.如果是关注的,则发放礼券.每个我网站的会员只会发放一次礼券.如果第二次则会提示已领取过礼券 ...

  10. spring boot快速入门 7: 使用aop处理请求

    样例:登陆拦截(aop简单样例) 第一步:在pom 文件中加入aop依赖 <!-- spring aop --> <dependency> <groupId>org ...