题目

  点这里看题目。

分析

  以下设\(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]异或凑数的更多相关文章

  1. 51Nod1577 异或凑数 线性基

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

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

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

  3. 51nod 1577 异或凑数

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

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

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

  5. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  6. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  7. [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 ...

  8. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  9. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

随机推荐

  1. utf8mb4复杂昵称问题

    wechat_ling wl_channel_consumer nickname wl_consumer nickname alter table wl_channel_consumer modify ...

  2. 计算程序运行时间(.net1.1 于.net2.0的区别)在.net2.0中提供了Stopwatch类,简单例子

    1. [代码].NET 2.0      using System.Diagnostics; private Stopwatch stw = new Stopwatch(); private void ...

  3. easyui API

    http://www.jeasyuicn.com/api/docTtml/index.htm

  4. chosen.jquery.js

    http://baifjece.blog.163.com/blog/static/33794654201286102519119/ ------------------首次加载设置默认选中项----- ...

  5. view组件的封装是否需要特有模型?

    必须需要. 现在接手的老项目,所有自定义组件全部使用的原始的全量数据,作为模型给view用来展示. 结果发现,基本数据的选择错误,需要选择另一个数据作为基本数据,这导致一个很麻烦的问题,需要改动全部的 ...

  6. vue使用stylus样式预处理器

    vue使用stylus样式预处理器,样式总是报错,需要从上一行的样式回车换行才不会报错 <style lang="stylus" scoped> .navbar mar ...

  7. SecureCRT 简单运用

    1.想要从本地电脑将文件通过secureCRT传输到远程服务器如下目录 2.在SecureCRT界面中使用快捷键[Alt+P] 打开了SFTP的界面 3.找到你要传的文件的地址[E:\a.zip] 4 ...

  8. 11_ArrayList集合的方法

    class Program { static void Main(string[] args) { //数组:长度不可变,类型单一 //ArrayList集合:长度可以任意改变,类型可以不单一 //创 ...

  9. 杂谈WebApiClient的性能优化

    前言 WebApiClient的netcoreapp版本的开发已接近尾声,最后的进攻方向是性能的压榨,我把我所做性能优化的过程介绍给大家,大家可以依葫芦画瓢,应用到自己的实际项目中,提高程序的性能. ...

  10. BUUCTF Crypto_WP(2)

    BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...