5092: [Lydsy1711月赛]分割序列

Time Limit: 5 Sec  Memory Limit: 256 MB
Submit: 219  Solved: 100
[Submit][Status][Discuss]

Description

对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b
_2 xor...xor b_i)+(b_{i+1} xor b_{i+2} xor...xor b_n))其中xor表示按位异或(XOR),给定一个长度为n的非
负整数序列a_1,a_2,...,a_n,请计算a的每个前缀的能量值。

Input

第一行包含一个正整数n(n<=300000),表示序列a的长度。
第二行包含n个非负整数a_1,a_2,...,a_n(0<=a_i<=10^6),依次表示a中每个元素的值。
 

Output

包含n行,每行一个整数,即a每个前缀的能量值。

 

Sample Input

5
1 2 3 4 5

Sample Output

1
3
6
10
9
 
    我们设c[i]为a[1]^a[2]^...^a[i],那么其实题目要求的就是对于每一个i求一个0<= j <=i使得 c[j] + (c[i] ^ c[j]) 最大。
    我们从高位到低位贪心,如果c[i]在某一位为0,那么我们如果可以找到一个c[j]在这一位为1是再好不过的了;如果c[i]在某一位是1的话,那么c[j]在这位不管是1还是0都对答案没有影响,所以我们可以忽略c[i]为1的那些位。
    因为我们是贪心的选,高位如果选了1的话那么之后这个1一定是要在选的里面的,所以现在问题就变成了: 给你一个数now,问你是否存在一个0<= j <=i 使得 c[j] & now = now.
    这显然是一个子集覆盖的问题,因为限制只有右界,所以我们只要让出现的位置尽量靠前就好了。
    于是设f[S]表示子集里有S的数最早出现的位置在哪,直接转移就行了。
    查询的时候从高位到低位贪心即可。
 
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=300005;
int n,a[maxn],MP[maxn*13],ci[35];
int main(){
ci[0]=1;
for(int i=1;i<=21;i++) ci[i]=ci[i-1]<<1;
scanf("%d",&n),memset(MP,0x3f,sizeof(MP));
for(int i=1;i<=n;i++) scanf("%d",a+i),a[i]^=a[i-1],MP[a[i]]=min(MP[a[i]],i); for(int i=ci[21]-1;i>=0;i--)
for(int j=0;j<=20;j++) if(i&ci[j]) MP[i^ci[j]]=min(MP[i^ci[j]],MP[i]); for(int i=1,now;i<=n;i++){
now=0;
for(int j=20;j>=0;j--) if(!(a[i]&ci[j])&&MP[now|ci[j]]<=i) now|=ci[j];
printf("%d\n",now+(a[i]^now));
} return 0;
}

  

 

bzoj 5092: [Lydsy1711月赛]分割序列的更多相关文章

  1. bzoj 5092 [Lydsy1711月赛]分割序列 贪心高维前缀和

    [Lydsy1711月赛]分割序列 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 213  Solved: 97[Submit][Status][Dis ...

  2. BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)

    题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\( ...

  3. bzoj 5092 [Lydsy1711月赛]分割序列——高维前缀和

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 套路地弄一个前缀异或和,就变成 f[ i ]=max_{j=0}^{i} { s[ j ...

  4. BZOJ:5092 [Lydsy1711月赛]分割序列(贪心&高维前缀和)

    Description 对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b _2 xor...xor ...

  5. BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)

    Description 对于一个长度为n的非负整数序列b_1,b_2,...,b_n,定义这个序列的能量为:f(b)=max{i=0,1,...,n}((b_1 xor b_2 xor...xor b ...

  6. bzoj 5094 [Lydsy1711月赛]硬盘检测 概率dp

    [Lydsy1711月赛]硬盘检测 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 273  Solved: 75[Submit][Status][Dis ...

  7. bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数

    [Lydsy1711月赛]图的价值 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 245  Solved: 128[Submit][Status][D ...

  8. BZOJ 5093[Lydsy1711月赛]图的价值 线性做法

    博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...

  9. BZOJ 5093: [Lydsy1711月赛]图的价值

    第二类斯特林数模版题 需要一些组合数的小$ trick$ upd:这里更新了本题巧妙的$ O(k)$做法,虽然常数很大就是了 传送门:here 题意:求所有$ n$个节点的无重边自环图的价值和,定义一 ...

随机推荐

  1. 《鸟哥的Linux私房菜》学习笔记(0)——磁盘与文件系统管理

    一.Linux的登陆流程 login: 用户名:每个用户名都有一个用户ID(用户标识符),计算机处理的就是用户ID(数字)而不是用户名(字符),. 认证机制:Authentication,比如密码或者 ...

  2. webpack + babel + vue 环境设置

    npm i webpack --save-dev npm install style-loader css-loader url-loader babel-loader sass-loader fil ...

  3. Python虚拟机类机制之从class对象到instance对象(五)

    从class对象到instance对象 现在,我们来看看如何通过class对象,创建instance对象 demo1.py class A(object): name = "Python&q ...

  4. IBOutletCollection 索引获取顺序问题

    在sb中绑定了一个IBOutletCollection后,根据索引获取元素发现和自己拖线时的顺序不同,有时又会根据顺序,不知道是xcode的bug还是本身就是无序的. 在使用的时候直接排序: - (v ...

  5. IOS开发---菜鸟学习之路--(二十四)-iOS7View被导航栏遮挡问题的解决

    (此文为复制帖,原文地址为:http://blog.sina.com.cn/s/blog_a8192bdd0101af40.html) self.navigationController.naviga ...

  6. jquery实现轮播插件

    这几天用jquery写了两个轮播的插件,功能很简单.第一次尝试写插件,有很多不足的地方,代码如下: 注:图片链接请替换掉,配置信息必须加上图片width和height. <!DOCTYPE ht ...

  7. 所有 Python 程序员必须要学会的「日志」记录。

    本文字数:3840 字 阅读本文大概需要:10 分钟 写在之前 在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题, ...

  8. [oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值

    1 需求:登录或者注册页面存在以下问题 - 无法记住上次提交的内容,(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)- 重复进行提交数据的校验(数据是否为空,长度大小等等) 2 d ...

  9. js日期处理

    Js获取当前日期时间及其它操作 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整 ...

  10. POJ 3368:Frequent values(线段树区间合并)

    题目大意,给出一段非降序列,求一些区间中出现频率最高的数的出现次数. 分析: 显然,区间中一个数多次出现必然是连续的,也就是最长的连续相等的一段. 用线段树解决,维护三个信息:一个区间最长连续的区间的 ...