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. 【小程序入门集锦】19,微信小程序个人帐号申请

    个人账号与企业帐号相比,缺少支付等功能,与个人订阅号类似.   小程序开放个人开发者申请注册,个人用户可访问微信公众平台,扫码验证个人身份后即可完成小程序帐号申请并进行代码开发.   下面我们就来说说 ...

  2. Jquery查询分析器

    find() 方法获得当前元素集合中每个元素的后代,通过选择器.jQuery 对象或元素来筛选.$(this).find("ul[index=1] div input:radio:check ...

  3. 68、TSPL指令集(标签打印机)

    0.开发者pdf.sdk等资料详见: http://download.csdn.net/detail/kunyashaw/9376694 1.测试代码 包含文字打印.条形码打印.二维码打印 packa ...

  4. 【Best Time to Buy and Sell Stock】cpp

    题目: Say you have an array for which the ith element is the price of a given stock on day i. If you w ...

  5. bugku 普通的二维码

    记录下对进制转换实现的重新思考. 扫描二维码扫到了一句垃圾话. 拖到winhex里面. 一开始以为是十进制直接转ascii,发现错误. 后来发现,最大数是7,八进制转换吧. 我是打算用python的l ...

  6. jmeter连接数据库之增删改查

    配置jdbc: 查询sql配置: 插入sql配置: 修改sql配置: 删除sql配置:

  7. 项目实战:CRM客户关系管理系统开发

    21-CRM第一节内容概要 21.1 Stark组件介绍:实现基本的增删改查+自定义复杂操作: 21.2 单例模式:最简单的单例模式: 21.3 路由系统(分发): 21.4 制作启动文件-Djang ...

  8. Leetcode 557.反转字符串中的单词III

    反转字符串中的单词III 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest ...

  9. Leetcode 516.最长回文子序列

    最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1:输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 " ...

  10. maven学习(十四)——Eclipse中使用Maven插件

    1.导入Maven项目 File→import