[51nod1577]异或凑数
题目
点这里看题目。
分析
以下设\(k=\lfloor\log_2(\max a)\rfloor\)。
关于异或凑数的问题自然可以用线性基处理,即如果可以插入到线性基,就说明无法凑出这个数。
于是我们就有了一个线段树或者倍增维护区间线性基的方法,时间是\(O(k^2nlog_2n)\)。
......算了。
考虑对每一个点维护线性基\(B_i\),维护的是\([1,i]\)的 " 最优 " 线性基。 " 最优 " 意味着线性基中的元素在原序列中的位置是最靠后的。
查询\([l,r]\)的时候,我们就只能用\(B_r\)中位置\(\ge l\)的元素,可以发现这样的线性基可以最多地用上里面的元素,因而是最优的。
考虑递推地构造\(B\)。我们从\(B_{i-1}\)推到\(B_i\):将\(B_{i-1}\)中的元素取出来,和\(a_i\)一起按照位置从大到小插入到\(B_i\)之中。可以发现这样构造的线性基可以凑出\([1,i]\)的数,并且肯定是最优的。
根据这个构造方法我们还可以发现,查询\([l,r]\)的时候用到的线性基的元素一定可以凑出\([l,r]\)的数。那些位置小于\(l\)的元素没有被占掉说明了\([l,r]\)中不需要它也可以凑出来。
这样递推是\(O(k^2n)\),还是很慢,继续优化。
\(B_i\)到\(B_{i-1}\)明明只多了一个\(a_i\),我们却花了\(O(k^2)\),这显然很不划算。
如果\(a_i\)可以直接插入到\(B_{i-1}\)中,我们就可以将插入\(a_i\)后的\(B_{i-1}\)作为\(B_i\)。
否则,我们找出与插入值出现冲突的元素。如果插入值的位置比原元素更优,我们应该让插入值替换成当前位的元素,并让原元素作为插入值继续插入;否则我们就不交换,继续下一步。
可以发现这样替换得到的\(B_i\)肯定是最优的。由于替换出来的元素仍然会进行插入操作,并且对于\(j\)位上的原元素,它在\(j\)位以上不会有值,因此线性基可以凑出\([1,i]\)的元素。因此我们得到了合法的最优\(B_i\)。时间是\(O(kn)\)。
代码
#include <cstdio>
const int MAXN = 5e5 + 1, MAXLOG = 31;
template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
}
template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
}
template<typename _T>
void swapp( _T &x, _T &y )
{
_T t = x; x = y, y = t;
}
struct node
{
int val, pos;
node() {}
node( const int V, const int P ) { val = V, pos = P; }
bool operator > ( const node & b ) { return pos > b.pos; }
};
node base[MAXN][MAXLOG];
int a[MAXN];
int N;
int main()
{
read( N );
for( int i = 1 ; i <= N ; i ++ ) read( a[i] );
for( int i = 1 ; i <= N ; i ++ )
{
node cur = node( a[i], i );
for( int j = 29 ; ~ j ; j -- ) base[i][j] = base[i - 1][j];
for( int j = 29 ; ~ j ; j -- )
if( ( cur.val >> j ) & 1 )
{
if( ! base[i][j].val ) { base[i][j] = cur; break; }
if( base[i][j].pos < cur.pos ) swapp( base[i][j], cur );
cur.val ^= base[i][j].val;
}
}
int T, l, r, v;
read( T );
while( T -- )
{
read( l ), read( r ), read( v );
for( int j = 29 ; ~ j ; j -- )
if( ( v >> j ) & 1 )
{
if( ! base[r][j].val || base[r][j].pos < l ) break;
v ^= base[r][j].val;
}
puts( v ? "Budexin" : "Koyi" );
}
return 0;
}
[51nod1577]异或凑数的更多相关文章
- 51Nod1577 异或凑数 线性基
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1577.html 题意 给定一个长度为 n 的序列. 有 m 组询问,每一组询问给出 L,R,k ,询 ...
- 51Nod1577 异或凑数 线性基 构造
国际惯例的题面:异或凑出一个数,显然是线性基了.显然我们能把区间[l,r]的数全都扔进一个线性基,然后试着插入w,如果能插入,则说明w不能被这些数线性表出,那么就要输出"NO"了. ...
- 51nod 1577 异或凑数
思路真的是挺巧妙的. 让我惊叹,原来线性基还能这么做?!?! 好吧,这种取若干个数异或凑数的题目怎么能少的了线性基呢? 但是,问题集中在于怎么快速提取一个区间的线性基 暴力n^2 线段树维护线性基?分 ...
- 51nod 1577 异或凑数 线性基的妙用
\(OTZgengyf\)..当场被吊打\(QwQ\) 思路:线性基 提交:\(3\)次 错因:往里面加数时\(tmp.p\)与\(i\)区分不清(还是我太菜了) 题解: 我们对每个位置的线性基如此操 ...
- Android数据加密之异或加密算法
前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...
- Oracle数据库异机升级
环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- [PHP][位转换积累]之异或运算的简单加密应用
异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...
- Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5646 Accepted: 1226 Description In an ...
随机推荐
- mysql运维入门2:主从架构
mysql主从原理 随着访问量的增加,数据库压力的增加,需要对msyql进行优化和架构改造,优化方法有: 高可用 主从复制 读写分离 拆分库 拆分表 原理 异步复制过程 master开启bin-log ...
- 使用包时,报 xxx.default is not a function
最近做了一个导出功能,代码如下 import request from 'request-promise-native'; export default class Form { // 导出 @po ...
- 重学 Java 设计模式:实战建造者模式
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 乱码七糟 [luàn qī bā zāo],我时常怀疑这个成语 ...
- [SD心灵鸡汤]007.每月一则 - 2015.11
1.不要因为世界太过复杂,而背叛了你的单纯. 2.人的一生要疯狂一次,无论是为一个人,一段情,一段路途或一个梦想. 3.时间真的很神奇,你永远不知道它会如何改变你.换句话说:以前难吃的蔬菜.苦涩的啤酒 ...
- [JavaWeb基础] 014.Struts2 标签库学习
在Struts1和Struts2中都有很多很方便使用的标签库,使用它可以让我们的页面代码更加的简洁,易懂,规范.标签的形式就跟html的标签形式一样.上面的篇章中我们也讲解了自定义标签那么在如何使用标 ...
- Java中的集合(十二) 实现Map接口的WeakHashMap
Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...
- MySQL如何有效的存储IP地址
前几天,阿淼的一个朋友去面试,他回来告诉我,面试官问他 IP 地址是怎么存在数据库的?他当时也没多想,直接就回答的存字符串啊(心想:这么简单的问题,怕不是看不起我吧) 前面这段权当看看,毕竟 IP地址 ...
- C语言/Linux命令行参数argc、argv[ ]详解
1.void main(int argc,char *argv[]) argv[]:表示的是一个指针数组,一共有argc个元素,其中存放的是指向每一个参数的指针. argc:参数个数 2.以Linux ...
- jchdl - RTL实例 - MOS6502 CPU
https://mp.weixin.qq.com/s/OguQKMU64GGdinCJjgyeKw 实现MOS6502 CPU,主要是实现状态机. 参考链接 https://github.co ...
- 面试题: Java中各个集合类的扩容机制
个人博客网:https://wushaopei.github.io/ (你想要这里多有) Java 中提供了很多的集合类,包括,collection的子接口list.set,以及map等.由于它 ...