51Nod1577 异或凑数 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1577.html
题意
给定一个长度为 n 的序列。
有 m 组询问,每一组询问给出 L,R,k ,询问 L,R 区间内是否能找出一些数,使它们 XOR 起来等于 k 。
$n,m\leq 5\times 10^5, 0\leq a_i,k< 2^{30}$
题解
由于 $n,m$ 同阶,所以以下时间复杂度描述时,对于 $n,m$ 不加区分。
线性基合并是 $O(\log ^2 a_i)$ 的。
直接线段树维护区间线性基或者 ST 表复杂度均为 $O(n\log ^3 a_i)$ 。
CDQ分治时间复杂度为 $O(n\log ^2 a_i)$ 。
以上算法均不能通过。
考虑将询问离线,按照 R 从小到大排序。
我们将 $a_i$ 从左到右依次加入。利用线性基维护尽量靠右的基向量即可(经典套路)。
时间复杂度为 $O(n\log a_i)$ 。
代码
#include <bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=500005;
int n,m;
int a[N];
struct xxj{
int v[30],p[30];
void clear(){
memset(v,0,sizeof v);
memset(p,0,sizeof p);
}
void insert(int x,int y){
for (int i=29;i>=0;i--)
if (~x>>i&1)
continue;
else if (!v[i]){
v[i]=x,p[i]=y;
break;
}
else {
if (y>p[i])
swap(y,p[i]),swap(x,v[i]);
x^=v[i];
}
}
int query(int x,int y){
for (int i=29;i>=0;i--)
if (x>>i&1)
if (!v[i]||p[i]<y)
return 0;
else
x^=v[i];
return 1;
}
}xianxingji;
struct Query{
int L,R,k,id,ans;
}q[N];
bool cmpR(Query a,Query b){
return a.R<b.R;
}
bool cmpid(Query a,Query b){
return a.id<b.id;
}
int main(){
n=read();
for (int i=1;i<=n;i++)
a[i]=read();
m=read();
for (int i=1;i<=m;i++){
q[i].L=read();
q[i].R=read();
q[i].k=read();
q[i].id=i;
}
sort(q+1,q+m+1,cmpR);
xianxingji.clear();
for (int i=1,j=0;i<=m;i++){
while (j<q[i].R)
j++,xianxingji.insert(a[j],j);
q[i].ans=xianxingji.query(q[i].k,q[i].L);
}
sort(q+1,q+m+1,cmpid);
for (int i=1;i<=m;i++)
puts(q[i].ans?"YES":"NO");
return 0;
}
51Nod1577 异或凑数 线性基的更多相关文章
- 51Nod1577 异或凑数 线性基 构造
国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...
- 51nod 1577 异或凑数 线性基的妙用
\(OTZgengyf\)..当场被吊打\(QwQ\) 思路:线性基 提交:\(3\)次 错因:往里面加数时\(tmp.p\)与\(i\)区分不清(还是我太菜了) 题解: 我们对每个位置的线性基如此操 ...
- [51nod1577]异或凑数
题目 点这里看题目. 分析 以下设\(k=\lfloor\log_2(\max a)\rfloor\). 关于异或凑数的问题自然可以用线性基处理,即如果可以插入到线性基,就说明无法凑出这个 ...
- 【XSY2701】异或图 线性基 容斥原理
题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个 ...
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- 【loj114】k大异或和 线性基+特判
题目描述 给由 $n$ 个数组成的一个可重集 $S$ ,每次给定一个数 $k$ ,求一个集合 $T⊆S$ ,使得集合 $T$ 在 $S$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...
- LOJ.114.K大异或和(线性基)
题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...
- bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基
题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...
- LOJ #113. 最大异或和 (线性基)
题目链接:#113. 最大异或和 题目描述 这是一道模板题. 给由 \(n\) 个数组成的一个可重集 \(S\),每次给定一个数 \(k\),求一个集合 \(T \subseteq S\),使得集合 ...
随机推荐
- ACL认证 vs 密码认证
呼入时需要进行认证:acl IP认证 和 密码认证. acl 认证优先进行. ACL认证成功: Access Granted. 直接进入 sip_profile>context 进行路由 A ...
- mysql 5.7 Group Replication
MySQL 组复制实现了基于复制协议的多主更新(单主模式). 复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务.但所有读写(RW)事务只有在冲突检测成功后才会提 ...
- Eclipse中三种设置编码格式的方法
转自:https://blog.csdn.net/rainy_black_dog/article/details/52403735 很早以前听过一位老师说过:咱们中国人不管学习哪种编程语言,总会遇到乱 ...
- 前端 ----关于DOM的操作的相关实例
关于DOM操作的相关案例 1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE ...
- GitHub访问慢
问题描述 一直都觉得访问 GitHub 时速度非常慢,刷新一下都要等好久!于是尝试一下能否解决掉... github.com assets-cdn.github.com avatar2.githubu ...
- java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 < java 实现往oracle存储过程中传递array数组类型的参数 >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...
- Confluence 6 配置服务器基础地址
服务器基础地址(Server Base URL)是用户访问 Confluence 的 URL 地址.这个基础的 URL 地址必须与你在浏览器中访问 Confluence 中的地址. Confluenc ...
- linux之iptables常用命令
iptables详解 iptables -L 该命令会以列表的形式显示出当前使用的 iptables 规则,每一条规则前面的编号可以用来做为其它操作--例如删除操作--的参数,很有用 iptables ...
- Java的动手动脑(七)
日期:2018.11.18 博客期:025 星期日 Part 1:使用 Files.walkFileTree()来找出指定文件夹下大小大于1KB的文件 package temp; import jav ...
- 【linux】ftp使用端口转发问题
相关资料: 1.[ssh]端口转发 2.[ftp]主动模式和被动模式 先说结论:用端口转发无法解决ftp客户端与服务器的连接问题,原因是ftp的data端口不固定,不能把所有>1024的端口都做 ...