51nod 1577 异或凑数 线性基的妙用
\(OTZgengyf\)。。当场被吊打\(QwQ\)
思路:线性基
提交:\(3\)次
错因:往里面加数时\(tmp.p\)与\(i\)区分不清(还是我太菜了)
题解:
我们对每个位置的线性基如此操作:
对于每一位,保存尽量靠后的数;
所以每一位还要记录位置。
(后文区分"位"(二进制位)和"位置"(原数组中的第几位),每个位置都有\(30\)位)
具体来说,就是从高位向低位扫,如果我们当前的数能被放入某一位,如果这一位没有数,则直接放入;否则比较出现位置,如果当前数出现位置较为靠后,就把当前数和这一位的数交换,然后从下一位继续进行插入。这样高位上的数会出现的尽量靠后。
查询的时候,从高位到低位进行查询。如果需要某位上面的数而这个数出现的位置\(<l\),直接输出'NO'。
#include<cstdio>
#include<iostream>
#define R register int
using namespace std;
namespace Luitaryi {
static char B[1<<15],*S=B,*T=B;
#define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
template<class I> inline I g(I& x) { x=0;
register I f=1; register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*=f;
} const int N=5e5+10;
#define pc(x) putchar(x)
struct node {int c,p; node() {}
node(int _c,int _p):c(_c),p(_p) {}
}f[N][31];
int n,m;
inline void main() {
g(n); for(R i=1,x;i<=n;++i) {
g(x); register node tmp(x,i);
memcpy(f[i],f[i-1],sizeof(f[i-1]));
for(R k=30;~k;--k) if(tmp.c&(1<<k)) {
if(!f[i][k].c) {
f[i][k].c=tmp.c,f[i][k].p=tmp.p; break;
} else {
if(f[i][k].p<tmp.p) swap(tmp.c,f[i][k].c),swap(f[i][k].p,tmp.p);
tmp.c^=f[i][k].c;
}
}
} g(m); for(R i=1,l,r,x;i<=m;++i) {
g(l),g(r),g(x);
for(R k=30;~k;--k) if(x&(1<<k)) {
if(!f[r][k].c||f[r][k].p<l) {
pc('N'),pc('O'),pc('\n'); goto end;
} x^=f[r][k].c;
} pc('Y'),pc('E'),pc('S'); pc('\n'); end:;
}
}
} signed main() {Luitaryi::main(); return 0;}
2019.08.12
88
51nod 1577 异或凑数 线性基的妙用的更多相关文章
- 51nod 1577 异或凑数
思路真的是挺巧妙的. 让我惊叹,原来线性基还能这么做?!?! 好吧,这种取若干个数异或凑数的题目怎么能少的了线性基呢? 但是,问题集中在于怎么快速提取一个区间的线性基 暴力n^2 线段树维护线性基?分 ...
- 51Nod1577 异或凑数 线性基 构造
国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...
- 51Nod1577 异或凑数 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1577.html 题意 给定一个长度为 n 的序列. 有 m 组询问,每一组询问给出 L,R,k ,询 ...
- 【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\),使得集合 ...
随机推荐
- hashCode和identifyHashCode的区别
API: System类提供一个identifyHashCode(Object o)的方法,该方法返回指定对象的精确hashCode值,也是根据该对象的地址计算得到的HashCode值.当某个类的ha ...
- poj 1852&3684 题解
poj 1852 3684 这两题思路相似就放在一起. 1852 题意 一块长为L长度单位的板子(从0开始)上有很多只蚂蚁,给出它们的位置,它们的方向不确定,速度为每秒一长度单位,当两只蚂蚁相遇的时候 ...
- 十六、USB驱动
一.USB固件和USB传输方式 USB固件: USB固件一般不需要我们编写,在此不做程序分析. USB固件中包含USB设备的出厂信息,如厂商ID.产品ID.主版本号和次版本号等.这就是为什么当我们把U ...
- Fiddler讲解2
想要 浏览更多Fiddler内容:请点击进入Fiddler官方文档 阅读目录: 一.查看网络流量: 二.检查网络流量: 三.查看Web会话摘要: 四.查看Web会话统计信息: 五.查看Web会话内容: ...
- SPA项目首页导航+左侧菜单
Mock.js是个啥 前后端分离之后,前端迫切需要一种机制,不再需要依赖后端接口开发,而今天的主角mockjs就可以做到这一点 Mock.js是一个模拟数据的生成器,用来帮助前端调试开发.进行前后端的 ...
- session和cookie有什么区别?
1.存储位置不同 cookie的数据信息存放在客户端浏览器上. session的数据信息存放在服务器上. 2.存储容量不同 单个cookie保存的数据<=4KB,一个站点最多保存20个Cooki ...
- linux学习之路(三)--centos7安装mysql(单点)
1.先检查系统是否装有mysql rpm -qa | grep mysql 返回空值,说明没有安装. 这里执行安装命令是无效的,因为centos-7默认是Mariadb,所以执行以下命令只是更新Mar ...
- Eclipse RCP使用SWT.EMBEDDED方式显示batik的svgCanvas后窗口最大化变白问题
// 设置svg组件一直动态(这一行代码导致了最大化变白的问题)svgCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);// 以下两行解决最大化变白 ...
- C#进阶系列——WebApi 传参详解
本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/datetime等).实体.数组等类型的参数如何传递. 回到顶部 一.get请求 对于取数据, ...
- JMeter-03-元件的作用域与执行顺序
JMeter元件的作用域与执行顺序 元件的作用域 先来讨论一下元件有作用域.<JMeter基础元件介绍>一节中,我们介绍了8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样 ...