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\),这一部分复杂度和莫队一样

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

大力讨论一下即可

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; namespace IO {
const int maxn(1 << 21 | 1); char ibuf[maxn], *iS, *iT, c;
int f; inline char Getc() {
return iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++;
} template <class Int> inline void In(Int &x) {
for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
for (x = 0; c >= '0' && c <= '9'; c = Getc()) x = x * 10 + (c ^ 48);
x *= f;
}
} using IO :: In; const int maxn(2e5 + 5); int cnt, v[maxn], n, m, k, a[maxn], sum[maxn], blo;
ll cur, ret[maxn], ans[maxn], pre1[maxn], pre2[maxn]; struct Qry {
int l, r, id; inline bool operator < (Qry b) const {
return l / blo != b.l / blo ? l < b.l : r < b.r;
}
} qry[maxn]; vector <Qry> q[maxn]; # define pk push_back int main() {
In(n), In(m), In(k), blo = sqrt(n);
for (int i = 0; i < 16384; ++i) {
int x = i, c = 0;
for (; x; x ^= x & -x) ++c;
if (c == k) v[++cnt] = i;
}
for (int i = 1; i <= n; ++i) In(a[i]);
for (int i = 1; i <= m; ++i) In(qry[i].l), In(qry[i].r), qry[i].id = i;
sort(qry + 1, qry + m + 1);
for (int i = 1, l = qry[1].r + 1, r = qry[1].r; i <= m; ++i) {
if (l < qry[i].l) q[r].pk((Qry){l, qry[i].l - 1, qry[i].id << 1});
else if (l > qry[i].l) q[r].pk((Qry){qry[i].l, l - 1, qry[i].id << 1});
l = qry[i].l;
if (r < qry[i].r) q[l - 1].pk((Qry){r + 1, qry[i].r, qry[i].id << 1 | 1});
else if (r > qry[i].r) q[l - 1].pk((Qry){qry[i].r + 1, r, qry[i].id << 1 | 1});
r = qry[i].r;
}
for (int i = 1; i <= n; ++i) {
pre1[i] = pre1[i - 1] + sum[a[i]];
for (int j = 1; j <= cnt; ++j) ++sum[a[i] ^ v[j]];
pre2[i] = pre2[i - 1] + sum[a[i]];
for (auto t : q[i]) for (int j = t.l; j <= t.r; ++j) ret[t.id] += sum[a[j]];
}
for (int i = 1, l = qry[1].r + 1, r = qry[1].r; i <= m; ++i) {
if (l < qry[i].l) cur += pre2[qry[i].l - 1] - pre2[l - 1] - ret[qry[i].id << 1];
else if (l > qry[i].l) cur += ret[qry[i].id << 1] - pre2[l - 1] + pre2[qry[i].l - 1];
l = qry[i].l;
if (r < qry[i].r) cur += pre1[qry[i].r] - pre1[r] - ret[qry[i].id << 1 | 1];
else if (r > qry[i].r) cur += ret[qry[i].id << 1 | 1] - pre1[r] + pre1[qry[i].r];
ans[qry[i].id] = cur, r = qry[i].r;
}
for (int i = 1; i <= m; ++i) printf("%lld\n", ans[i]);
return 0;
}

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. 基于datax的数据同步平台

    一.需求 由于公司各个部门对业务数据的需求,比如进行数据分析.报表展示等等,且公司没有相应的系统.数据仓库满足这些需求,最原始的办法就是把数据提取出来生成excel表发给各个部门,这个功能已经由脚本转 ...

  2. css中代码格式以及@import的语法结构

    CSS中代码格式 CSS是Cascading Style Sheets(层叠样式表)的缩写.是一种对web文档添加样式的简单机制,属于表现层的布局语言. 1.基本语法规范分析一个典型CSS的语句: p ...

  3. POJ 2239

    #include<iostream> #include<algorithm> #define MAXN 305 using namespace std; int _m[MAXN ...

  4. Centos7 DNS神奇的配置

    文件 [root@iff etc]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to co ...

  5. 【ORACLE】Bulk Processing with BULK COLLECT and FORALL

    https://orablogspot.blogspot.com/2014/09/ https://blogs.oracle.com/oraclemagazine/bulk-processing-wi ...

  6. 结合React使用Redux

    前面的两篇文章我们认识了 Redux 的相关知识以及解决了如何使用异步的action,基础知识已经介绍完毕,接下来,我们就可以在React中使用Redux了. 由于Redux只是一个状态管理工具,不针 ...

  7. spring boot快速入门 5: 事务管理

    事务管理: 新增两名女生: 第一步:创建 GirlRespository package com.payease.service; import com.payease.entity.Girl; im ...

  8. php 如何匹配中文或英文姓名

    这几天在做项目的用户注册时,想限制用户使用一些比较奇怪的字符作为名字,即使用中文或者英文名字. 查了一些资料,例如:网友挥得更高的百度空间 写下了以下函数. //验证名字和密码 if (!preg_m ...

  9. Javascript显示和隐式类型转换

    1.转换成字符串 多数的JavaScript宿主环境(比如Node.js和Chrome)都提供了全局函数toString: 与此同时Object.prototype也定义了toString方法,使得所 ...

  10. Linux下mysq基础命令(二)

    1. 创建数据库相关命令: mysql> STATUS(\s) - 列出当前mysql的相关状态信息 mysql> SHOW DATABASES; - 显示数据库列表 mysql> ...