luogu4462 异或序列
题目大意
给出n,m,k,有n个数的序列,m次询问一段区间,问异或和等于K的子区间的个数。
题解
本题一看就是莫队。但要解决该题需要以下性质:
定理:
$$a\oplus b=c\Leftrightarrow a\oplus c=b\Leftrightarrow b\oplus c=a$$
推论:
$$\oplus_{i=l}^r A_i= \oplus_{i=1}^r A_i \oplus \oplus_{i-1}^{l-1}A_i$$
因此,我们对每个节点维护它的前缀和。比如说,如果右方加入一个节点,因为右方r的前缀和异或左面l的前缀和的结果表示的就是[l+1,r]的异或和。此时增加的满足条件的子区间的个数,根据定理,便是当前区间中前缀和的值异或上新加入的节点的前缀和的值等于K的点的数量。这就可以用莫队的桶来维护了。
#define _DEBUG#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;const int MAX_N = 100010;
int K;
int BASE;struct CaptainMo
{int N, OpCnt, Sum;int PrefixValCnt[MAX_N];struct Data{int CurVal, Prefix;}_datas[MAX_N];struct Query{int L, R;int Ans;Query *This;Query():This(this){}bool operator < (const Query& a)const{return L / BASE == a.L / BASE ? R < a.R : L / BASE < a.L / BASE;}}_qs[MAX_N], temp[MAX_N];void InRange(Data cur){Sum += PrefixValCnt[cur.Prefix ^ K];PrefixValCnt[cur.Prefix]++;}void OutRange(Data cur){Sum -= PrefixValCnt[cur.Prefix ^ K];PrefixValCnt[cur.Prefix]--;}void Init(){for(int i = 1; i <= OpCnt; i++)_qs[i].L--;for(int i = 1; i <= N; i++)_datas[i].Prefix = _datas[i - 1].Prefix ^ _datas[i].CurVal;BASE = sqrt(N);memcpy(temp, _qs, sizeof(_qs));sort(temp + 1, temp + OpCnt + 1);}void Proceed(){int l = 0, r = 0;Sum = 0;PrefixValCnt[0] = 1;for(int i = 1; i <= OpCnt; i++){while(r > temp[i].R)OutRange(_datas[r--]);while(r < temp[i].R)InRange(_datas[++r]);while(l < temp[i].L)OutRange(_datas[l++]);while(l > temp[i].L)InRange(_datas[--l]);temp[i].This->Ans = Sum;}}
}g;int main()
{scanf("%d%d%d", &g.N, &g.OpCnt, &K);for(int i = 1; i <= g.N; i++)scanf("%d", &g._datas[i].CurVal);for(int i = 1; i <= g.OpCnt; i++)scanf("%d%d", &g._qs[i].L, &g._qs[i].R);g.Init();g.Proceed();for(int i = 1; i <= g.OpCnt; i++)printf("%d\n", g._qs[i].Ans);return 0;
}
转载于:https://www.cnblogs.com/headboy2002/p/9219452.html
luogu4462 异或序列相关推荐
- [CQOI2018]异或序列
[CQOI2018]异或序列 题意: 给定1个整数K,离线询问[l,r]中有多少子区间xor和=K. 题解: 异或有个重要的性质:它的逆运算就是自身 我们维护该数列的前缀异或和a[x],表示1到x的区 ...
- 6759: 异或序列
6759: 异或序列 时间限制: 1 Sec 内存限制: 128 MB 题目描述 已知一个长度为n的整数数列a1,a2,-,an,给定查询参数l.r,问在al,al+1,-,ar区间内,有多少子序列 ...
- Loj 2534 异或序列
Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...
- [CQOI2018] 异或序列
题目链接:戳我 哈哈哈我竟然秒切了省选题 莫队+异或. 考虑异或的性质,一个数同时异或两次等于没有进行操作.那么我们设a[i]为前i个数的异或和,显然对于一个区间\([l,now]\),\(a[l-1 ...
- BZOJ5301:[CQOI2018]异或序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5301 https://www.luogu.org/problemnew/show/P4462 已知 ...
- 【Luogu】P4462异或序列(莫队)
题目链接 观察什么时候x到y之间那一段可以被统计 xorsum[x-1]^xorsum[y]=k xorsum[x-1]=xorsum[y]^k||xorsum[y]=xorsum[x-1]^k 莫队 ...
- 【LOJ】#2534. 「CQOI2018」异或序列
题解 每个数都处理成前缀和,就相当于问\([l - 1,r]\)有几个数对\(x,y\),\(sum[x] ^ sum[y] = k\) 直接莫队即可 代码 #include <bits/std ...
- 洛谷 P4551 最长异或路径
题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...
- 01tire+洛谷P4551 最长异或路径
题目: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入格式 第一行一个整数NN,表示点数. 接下来 ...
最新文章
- 改变Error tip的背景色.
- PAT1052---------初步了解正则表达式
- 自制单选多选日历文本框文本域控件
- oracle 中表示字符串使用单引号
- 学习MSCKF笔记——后端、状态预测、状态扩增、状态更新
- springboot实现增量备份_SpringBoot canal数据同步解决方案
- Magicodes.IE已支持导出Word、Pdf和Html
- LeetCode MySQL 1212. 查询球队积分
- 数据归一化处理方法_科研常用的实验数据分析与处理方法
- boost.asio mysql_boost asio学习笔记
- 轻松使用EasyRecovery恢复丢失照片
- 资源分配博弈之纳什均衡和斯塔克尔伯格模型
- java 排队_JAVA实现排队论
- 卸载 Oracle 19c
- bandizip关闭自动更新提示的方法步骤
- OSChina 周四乱弹 —— 这个腿就有我来守护了
- Java Swing教程
- 【弘成基】运用资料整理
- Mac如何通过bootcamp(启动转换助理)安装Windows10系统?附教程和下载
- 【HTCVR】VRTK插件功能
热门文章
- Java 基础——类和对象
- Shell 脚本知识回顾 (六) —— Shell 函数
- C语言日志操作类实例
- vue-cli3中的vue.config.js配置
- React开发(166):ant design form 设置值
- 前端学习(3305):函数组件usermemo和usercallback
- 前端学习(3283):立即执行函数二
- [html] 谈谈你对input元素中readonly和disabled属性的理解
- [html] js放在html的<body>和<head>有什么区别?
- [vue] 如何在子组件中访问父组件的实例?