BZOJ 5092: 分割序列 贪心 高维前缀和
2018-01-05 20:16
183 查看
5092: 分割序列
Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 178 Solved: 68
[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
51 2 3 4 5
Sample Output
13
6
10
9
最开始没做出来
看了题解之后:高维前缀和。。什么鬼?
还是来点蒟蒻的讲题方式吧:
考虑对于一个前缀 a
若其第j位为1:
则这一位对前缀能量值的贡献有且只有1
否则
可能为0/2
那么现在就是求使得a的非零位的贡献尽量多
那么就贪心尽量令高位的贡献大
从高到低枚举就好
具体来讲:
维护具有子集S的最靠前的前缀的位置 //这个是不是就是高维前缀和啊。。。
(博主去看了下高维前缀和。一个集合S代表的是它的所有“超集”的和)
每次在前缀里找符合条件的贡献尽量大的子集就好
至于其他位 就不用管了 要么贡献一定为1 要么就是在最优解的情况下为0
#include<cmath> #include<ctime> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<iomanip> #include<vector> #include<string> #include<bitset> #include<queue> #include<set> #include<map> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} return x*f; } void print(int x) {if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');} const int N=(1<<20)+100; int a ,f[N+1000000]; int main() { memset(f,0X3f,sizeof(f)); int n=read(); register int i,j,cur; for(i=1;i<=n;++i) a[i]=read()^a[i-1], f[a[i]]=min(f[a[i]],i); for(j=19;~j;j--) for(i=1;i<(1<<20);++i) if(!(i&(1<<j))) f[i]=min(f[i],f[i|(1<<j)]); for(i=1;i<=n;++i) { cur=0; for(j=19;~j;j--) if(!(a[i]&(1<<j)) && f[cur|(1<<j)]<=i) cur|=1<<j; print(cur+cur+a[i]);puts(""); } return 0; }
相关文章推荐
- 【bzoj 5092】分割序列(贪心、高维前缀和)
- [贪心 高维前缀和] BZOJ5092. 分割序列
- bzoj 5092: 分割序列 贪心
- [BZOJ1044][HAOI2008]木棍分割 二分+贪心+dp+前缀和优化
- [BZOJ3675][Apio2014]序列分割
- 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP
- [BZOJ3675][Apio2014]序列分割(斜率优化dp)
- [BZOJ3675][Apio2014]序列分割-斜率优化-动态规划
- bzoj1562 [NOI2009]变换序列(二分图完美匹配+贪心)
- bzoj3675: [Apio2014]序列分割
- bzoj3675[Apio2014]序列分割 斜率优化dp
- bzoj3675: [Apio2014]序列分割
- BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )
- 【bzoj 3675】序列分割(斜率优化DP)
- 【bzoj3675】[Apio2014]序列分割 单调队列+斜率优化
- BZOJ 3675: [Apio2014]序列分割
- bzoj 3675: [Apio2014]序列分割【斜率优化dp】
- BZOJ 3675: [Apio2014]序列分割
- [bzoj3675] [Apio2014]序列分割 Split the sequence dp+斜率优化
- BZOJ 3675 序列分割