\(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 异或凑数 线性基的妙用的更多相关文章

  1. 51nod 1577 异或凑数

    思路真的是挺巧妙的. 让我惊叹,原来线性基还能这么做?!?! 好吧,这种取若干个数异或凑数的题目怎么能少的了线性基呢? 但是,问题集中在于怎么快速提取一个区间的线性基 暴力n^2 线段树维护线性基?分 ...

  2. 51Nod1577 异或凑数 线性基 构造

    国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...

  3. 51Nod1577 异或凑数 线性基

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1577.html 题意 给定一个长度为 n 的序列. 有 m 组询问,每一组询问给出 L,R,k ,询 ...

  4. 【XSY2701】异或图 线性基 容斥原理

    题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个 ...

  5. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  6. 【loj114】k大异或和 线性基+特判

    题目描述 给由 $n​$ 个数组成的一个可重集 $S​$ ,每次给定一个数 $k​$ ,求一个集合 $T⊆S​$ ,使得集合 $T​$ 在 $S​$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...

  7. LOJ.114.K大异或和(线性基)

    题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...

  8. bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基

    题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...

  9. LOJ #113. 最大异或和 (线性基)

    题目链接:#113. 最大异或和 题目描述 这是一道模板题. 给由 \(n\) 个数组成的一个可重集 \(S\),每次给定一个数 \(k\),求一个集合 \(T \subseteq S\),使得集合 ...

随机推荐

  1. Spring Boot 入门(八):集成RabbitMQ消息队列

    本片文章续<Spring Boot 入门(七):集成 swagger2>,关于RabbitMQ的介绍请参考<java基础(六):RabbitMQ 入门> 1.增加依赖 < ...

  2. 18 JSON、JSON字符串、反序列化

    JSON教程 : https://www.runoob.com/python/python-json.html 概念 JSON是一种轻量级的数据交换格式,它是一种数据格式! JSON易于阅读.易于解析 ...

  3. PAT甲级题分类汇编——序言

    今天开个坑,分类整理PAT甲级题目(https://pintia.cn/problem-sets/994805342720868352/problems/type/7)中1051~1100部分.语言是 ...

  4. Python内存加载shellcode

    生成 首先生成一个测试的msf shellcode msfvenom -p windows/x64/exec CMD=calc.exe -f python 把其中的shellcode复制出来留待待会使 ...

  5. [PKUSC2018]主斗地(搜索+贪心)

    首先如果对子和三张牌出现在解中,那么全拆成单张显然没有问题,顺子同理.于是真正有用的牌型就只有单牌.三带一.三带二.四带二了. 暴搜jry手中的牌,然后先搜出双方的大牌型(即三张.四张牌的个数),再枚 ...

  6. ubuntu配置fastdfs+Nginx

    全程参考主线来自:https://blog.csdn.net/xiaoxie762457/article/details/80690841(文中图片失效不造成影响) Nginx安装主要参考:https ...

  7. iOS - FMDB数据库的使用

    下面不废话了直接上代码

  8. K2 BPM_康熙别烦恼(上篇)——分级授权_工作流引擎

  9. BKP和RTC

    Stm32内部有多个BKP寄存器,在主电源被切断或者系统产生复位的时候,BKP寄存器仍然可以利用备用电源的支持保持其重要内容. BKP在实际应用中可以存入重要数据,防止被恶意查看. BKP有入侵检测, ...

  10. 在openwrt 17.01上编译最新nginx 1.14.2的笔记

    openwrt 17.01源码对应的nginx版本是1.10.2,有些新功能没有,所以需要升级到nginx 1.14.2最新的稳定版 https://github.com/macports/macpo ...