思路真的是挺巧妙的。

让我惊叹,原来线性基还能这么做?!?!

好吧,这种取若干个数异或凑数的题目怎么能少的了线性基呢?

但是,问题集中在于怎么快速提取一个区间的线性基

暴力n^2

线段树维护线性基?分区间logn,合并一次logn^2 O(nlogn^3)GG

然后就一脸不可做了。

题解:
“容易”想到,一个线性基里面的元素可以用线性基外的元素替换的。

只要保证还能表示出原来的线性空间,那么一定可以替换。

所以,我们给每个点维护一个线性基。

lb[r]表示,由1~r的所有元素选择构成的线性基,其中元素尽可能地靠后。

当lb[r-1]转移到lb[r]的时候,

可以把r-1的所有元素拿出来,把a[r]拿出来,按照位置排序,贪心加入lb[r]。

这样,预处理O(nlogn^2)

查询呢?直接把lb[r]中的元素拿出来,根据位置是否大于等于l放进一个临时线性基里。

之后把k尝试加入线性基,能加入就说明无法表出,否则可以。

O(nlogn^2)

但是还是过不去?!~?!?

发现,我们转移lb,查询的时候,真的是非常暴力的操作。

能不能再少一个log?

发现,lb[r-1]->lb[r]不就是可能多了一个a[r]吗?

所以有一个贪心策略:

首先复制过来lb[r-1],尝试加入x=a[r]

如果x有j位的1,lb中没有,加进去,break。

如果lb中有,如果lb的j这个位置的元素实际位置更靠前,那么可能询问的时候取不到,就和x换一下,然后继续放下一位(记得无论如何要异或一下)。

并且发现,我们这样做,会使得高位的位置尽可能靠后。

所以询问的时候,从高位到低位,如果没有这一位,那么直接NO就可以了。

如果一直可以,那么就是YES

Code:

#include<bits/stdc++.h>
#define numb ch-'0'
#define ri register int
#define il inline
using namespace std;
const int N=+;
const int M=;
int n,m;
int a[N];
char ch;
il void rd(int &x){
x=;
while(!isdigit(ch=getchar()));
for(x=numb;isdigit(ch=getchar());x=x*+numb);
}
struct node{
int lin[M];
int pos[M];
}lb[N];
int main()
{
rd(n);
for(ri i=;i<=n;i++){
rd(a[i]);
}
for(ri i=;i<=n;i++){
lb[i]=lb[i-];
int tmp=a[i];
int po=i;
for(ri j=;j>=;j--){
if(tmp&(<<j)){
if(lb[i].lin[j]==){
lb[i].lin[j]=tmp;
lb[i].pos[j]=po;
break;
}
else {
if(po>lb[i].pos[j])
{
swap(tmp,lb[i].lin[j]);
swap(po,lb[i].pos[j]);
}
tmp^=lb[i].lin[j];
}
}
}
}
rd(m);
int l,r,k;
for(ri i=;i<=m;i++){
rd(l),rd(r),rd(k);
bool fl=true;
for(ri j=;j>=;j--){
if(k&(<<j)){
if(lb[r].lin[j]==){
fl=false;break;
}
else{
if(lb[r].pos[j]<l){
fl=false;break;
}
else{
k^=lb[r].lin[j];
}
}
}
}
if(fl){
puts("YES");
}
else puts("NO");
}
return ;
}

upda:2016.6.10

其实就是一个套路,维护最晚时间线性基

只要证明两个事:

1.合法的区间一定合法,不合法的区间一定还是不合法

2.线性基里可以取的元素一定是[L,R]元素暴力加入后的线性基(相当于可以代替暴力插入[L,R]的元素)

先证明2

设R的最晚线性基为B,把[L,R]元素暴力插入的线性基是S

发现可以取的元素,如果形如a^b^c^d(不妨认为,出现时间a<b<c<d)那么如果这个元素可以保留,那么b,c,d有关的都可以保留,

所以一定是S的子集

又如果是真子集,即存在一个元素属于S,却不属于B,那么这个元素,一定可以顶替掉B中<L的一个元素,与最晚时间线性基矛盾

由于2成立,1自然就成立了。

51nod 1577 异或凑数的更多相关文章

  1. 51nod 1577 异或凑数 线性基的妙用

    \(OTZgengyf\)..当场被吊打\(QwQ\) 思路:线性基 提交:\(3\)次 错因:往里面加数时\(tmp.p\)与\(i\)区分不清(还是我太菜了) 题解: 我们对每个位置的线性基如此操 ...

  2. [51nod1577]异或凑数

    题目   点这里看题目. 分析   以下设\(k=\lfloor\log_2(\max a)\rfloor\).   关于异或凑数的问题自然可以用线性基处理,即如果可以插入到线性基,就说明无法凑出这个 ...

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

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

  4. 51Nod1577 异或凑数 线性基

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

  5. 51nod 1577 线性基

    思路: http://blog.csdn.net/yxuanwkeith/article/details/53524757 //By SiriusRen #include <bits/stdc+ ...

  6. 51nod 1301 集合异或和——异或dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1301 好题!看了TJ才会. 因为是不可重集合,所以当然有前 i 个 ...

  7. 51Nod XOR key —— 区间最大异或值 可持久化字典树

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key  题目来源: HackerRa ...

  8. 【51nod】1312 最大异或和

    题解 很显然我们求出一组线性基来,如果有M个基,那么可以构造N - M + 1个最大异或值 而对于线性基中的元素,除了最大的元素,我们用最大异或值异或掉每个元素累加进答案 而不是把线性基中的元素处理成 ...

  9. 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)

    1295 XOR key 2 秒 262,144 KB 160 分 6 级题   给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...

随机推荐

  1. Django Rest Framework源码剖析(七)-----分页

    一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...

  2. 汇编-MOV指令

    知识点:  MOV指令  基址  内联汇编  把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...

  3. vijos 1641 Vs Snowy

    代码: #include<set> #include<cstdio> #include<cstring> #include<iostream> #inc ...

  4. idea Cannot Resolve Symbol 问题解决

    总结:要多根据有问题的提示来进行百度搜索,这一次我就是搜索了 idea 提示的错误信息 Cannot Resolve Symbol ,才找到的解决方案,所以说出现问题,如果不是很复杂的场景或者原因很多 ...

  5. IT高管和易筋经的故事

    老板是我非常敬重的前领导之一,他的一些管理风格,也影响了后来我对技术团队的管理. 理想企业 什么是程序员理想的IT企业?公司里面有良好的同事关系,合理的产品需求和开发进度,最好老板懂点编程,这样公司更 ...

  6. AngularJS + CoffeeScript 前端开发环境配置详解

    AngularJS 号称 '第一框架' ('The first framework') 确实是名不虚传.由其从jQuery中完全转入AngularJS后就有无法离开他的感觉了.虽然AngularJS的 ...

  7. Boyer and Moore Fast majority vote algorithm(快速选举算法)

    问题来来自于leetcode上的一道题目,https://leetcode.com/problems/majority-element/,大意是是找出一个数组中,出现次数超过一个半的数字,要求是O(n ...

  8. Jmeter(二十三)_插件扩展

    Jmeter插件管理器 安装插件的方法有两种,一种是传统的方式,即官网下载,本地配置,重启jmeter.现在有一种快捷的方法可以自定义安装插件-插件管理器 JMeter 插件管理器的使用方法很简单:不 ...

  9. uwsgi+django架构程序内部无法获取全局变量

    近期开发了一个djangoi程序,用django自带的python manage.py runserver 0.0.0.0:80 运行方式无任何问题,但用django+nginx+uwsg部署运行有时 ...

  10. 转 git config命令使用

    . git config简介 我们知道config是配置的意思,那么git config命令就是对git进行一些配置.而配置一般都是写在配置文件里面,那么git的配置文件在哪里呢?互动一下,先问下大家 ...