[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 ...
随机推荐
- 【面经分享】互联网寒冬,7面阿里,终获Offer,定级P6+
点赞再看,养成习惯,微信搜索[敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文 ...
- MyBatis通过注解方式批量添加、修改、删除
唯能极于情,故能极于剑 注: 本文转载于:CodeCow · 程序牛 的个人博客:http://www.codecow.cn/ 一.数据库实体DO public class User implemen ...
- 跳出初学MySQL知识的原理整理(一)
一.基础架构 MySQL 可以分为 Server 层和存储引擎层两部分. Server 层包括连接器.查询缓存.分析器.优化器.执行器等,所有跨存储引擎 的功能都在这一层实现,比如存储过程.触发器.视 ...
- 谁说双非本科就一定无缘阿里?H哥粉丝6面通过,喜提Offer!
本文来自作者投稿(原作者:小胖儿),原作者是一位2021届本科毕业生,就读于一所双非(非985.非211)院校,在今年2月份的时候,我曾经帮他指导过简历,并且根据他的简历内容帮他提了一些可能会问到的问 ...
- [注]一条牛B的游戏推送要具备哪些条件?
旁白:推送内容写的好,可以给游戏带来很大的收益,但如果写的很糟糕,就可能是在提醒用户还有一个该卸载的软件没卸载.那么如何写出一个优秀的推送内容呢? 总结:推送文字八字原则 从运营的角度来讲,我们需要找 ...
- BUUCTF Crypto
BUUCTF 几道crypto WP [AFCTF2018]Morse 简单的莫尔斯密码,最直观的莫尔斯密码是直接采用空格分割的点和划线,这题稍微绕了一下使用的是斜杠来划分 所以首先将斜杠全部替换为空 ...
- sku算法详解及Demo~接上篇
前言 做过电商项目前端售卖的应该都遇见过不同规格产品库存的计算问题,业界名词叫做sku(stock Keeping Unit),库存量单元对应我们售卖的具体规格,比如一部手机具体型号规格,其中ipho ...
- PHP生成指定范围的日期
/** * 生成指定范围的日期 * * @param $string $startDate 开始日期 2020-01-01 * @param $string $endDate 结束日期 2020-01 ...
- 七、Spring MVC高级技术
知识点 处理文件上传 使用flash属性 在控制器中处理异常 关键词 控制器通知 (Controller Advice) 7.1 处理异常 Spring提供了多种方式将异常转换为响应: 特定的Spri ...
- jchdl - RTL实例 - And2(结构体的使用)
https://mp.weixin.qq.com/s/qTgeBF9N0mx5UK3xWDb3jg jchdl对Verilog做了增强,增加了用户自定义结构体类型.使用自定义结构体,可以对输入和输 ...