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

Solution

题意其实就是对数组的异或前缀和$a[i]$,对每个$i$求出最大$a[j]+(a[j]~xor~a[i])$。

既然是二进制,就考虑按位贪心得出$a[j]$的值。

假设$a[i]$当前一位为$1$,那么$a[j]$的这一位选$0$或者$1$对答案都是一样的。

如果$a[i]$当前一位为$0$,那么$a[j]$就这一位填$1$。这一位填了$1$,后面贪每一位的时候必须包含这一位的$1$,也就是超集。这玩意儿用高维前缀和预处理一下最靠前的超集的位置就好了。

Code

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define N (1<<20)
 5 using namespace std;
 6
 7 int n,a[N],f[N];
 8
 9 int main()
10 {
11     memset(f,0x7f,sizeof(f));
12     scanf("%d",&n);
13     for (int i=1; i<=n; ++i)
14     {
15         scanf("%d",&a[i]);
16         a[i]^=a[i-1]; f[a[i]]=min(f[a[i]],i);
17     }
18     for (int i=0; i<20; ++i)
19         for (int j=0; j<(1<<20); ++j)
20             if (!(j&(1<<i))) f[j]=min(f[j],f[j^(1<<i)]);
21     for (int i=1; i<=n; ++i)
22     {
23         int ans=0,now=0;
24         for (int j=19; j>=0; --j)
25             if (a[i]&(1<<j)) ans+=(1<<j);
26             else if (f[now^(1<<j)]<=i) ans+=(1<<j)*2, now^=(1<<j);
27         printf("%d\n",ans);
28     }
29 }

转载于:https://www.cnblogs.com/refun/p/10161118.html

BZOJ5092:[Lydsy1711月赛]分割序列(贪心,高维前缀和)相关推荐

  1. bzoj5092: [Lydsy1711月赛]分割序列

    [题解] 理解得迷迷糊糊... 一些准备操作就不说了吧.. 首先对于当前的第i个数,贪心思想按二进制位从高到低考虑. 若当前第j位是1,不管异或0还是1,这一位的贡献肯定是1<<j,不考虑 ...

  2. bzoj 5092: [Lydsy1711月赛]分割序列

    5092: [Lydsy1711月赛]分割序列 Time Limit: 5 Sec  Memory Limit: 256 MB Submit: 219  Solved: 100 [Submit][St ...

  3. [JZOJ5952] 凯旋而归 ([BZOJ 5092]【Lydsy1711月赛】分割序列)【高维前缀和】【DP】

    Description 对于一个长度为m的序列a,记f(a)=max⁡((a1xor...xorai)+(ai+1xor...xoran)),i∈[0,m]f(a)=\max((a_1\ xor\ . ...

  4. SPOJ.TLE - Time Limit Exceeded(DP 高维前缀和)

    题目链接 \(Description\) 给定长为\(n\)的数组\(c_i\)和\(m\),求长为\(n\)的序列\(a_i\)个数,满足:\(c_i\not\mid a_i,\quad a_i\& ...

  5. sosdp(高维前缀和)学习笔记

    高维前缀和 我们先看一维前缀和 for(int i=1;i<=n;i++) s[i]+=s[i-1]; 那么二维前缀和 for(int i=1;i<=n;i++) for(int j=1; ...

  6. Team Work(CF 932 E)[bzoj5093][Lydsy1711月赛]图的价值

    0 前言 这是一道小清新题 1 题目相关 1.1传送门 传送门 1.2 题目大意 给出n,kn,kn,k,求∑i=0n(ni)ik\sum_{i=0}^n\binom{n}{i}i^ki=0∑n​(i ...

  7. Codeforces Round #257 (Div. 1) D. Jzzhu and Numbers 高维前缀和 + 容斥

    传送门 文章目录 题意: 思路: 题意: 思路: 完全想不到容斥啊,看了半天也没看懂渍渍渍. 定义f[i]f[i]f[i]表示iii的超集个数,那么选择的方案就是2f[i]−12^{f[i]}-12f ...

  8. Deltix Round, Spring 2021 D. Love-Hate 随机化 + sos dp(高维前缀和)

    传送门 文章目录 题意: 思路: 题意: 给你nnn个朋友,一共有mmm种货币,一个朋友最多喜欢ppp种,用二进制给出111代表喜欢,让你选出最多的一个货币集合使得至少有⌈n2⌉\left \lcei ...

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

    bzoj5093: [Lydsy1711月赛]图的价值 题目描述 Solution 考虑每一个点的贡献,枚举它的度数. Ans=n∗2(n−12)∑i=1n−1(n−1i)∗ikAns=n*2^{\t ...

最新文章

  1. bfs迷宫寻路问题(一看就懂的讲解)
  2. pat 1034. Head of a Gang (30)
  3. java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇
  4. 升级Windows10后,远程登录失败,问题:您的凭据不工作(RDP do not work )
  5. Notes:DOM的事件模拟
  6. linux内核开源不能仿照_Linux内核开发,开源生产力工具,使用Google应用程序创建自动日历等
  7. IDEA中提示JAVA字符串常量过长
  8. 【Java从0到架构师】SpringBoot - MyBatis
  9. php接收post原始数据
  10. 运筹优化算法工程师面试汇总
  11. 必修三计算机选修三知识点总结,高中生物必修一、必修二、必修三、选修三知识点总结(人教版).pdf...
  12. python+selenium 定位元素踩过的坑
  13. 冰刃(IceSword)的使用方法(高级篇)
  14. TikTok视频流量黄金发布时间
  15. 五年北京,这个改变我命运的城市,终于要离开了(转)
  16. 企业微信个人二维码在哪里?会失效吗?
  17. 华为防火墙配置策略路由实现多个ISP出接口的智能选路
  18. 关于springboot整合mybatisplus中找不到数据库中的表的问题
  19. TI DSP TMS320F28335 CCS初级踩坑
  20. android查看轨迹,一种提取并分析Android手机行踪轨迹的方法

热门文章

  1. mt6735通用recovery_MTK65XX通用线刷刷机工具驱动-MTK65xx刷机工具驱动及教程下载最新免费版-西西软件下载...
  2. java 生成不重复随机数_Java如何实现生成n个不重复的随机数 Java实现生成n个不重复的随机数代码...
  3. mysql int 转 varchar_Java后端程序员必备:MySQL索引失效的十大杂症
  4. 远程桌面服务器怎么重启计算机,电脑怎么样远程重新启动
  5. mysql数据库编程(c 语言)_【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端...
  6. linux3.8内核下载,linux 3.8内核usbmouse代码注释
  7. python三维可视化图,如何使用Python在(交互式)3D中可视化图形?
  8. java swing 帮助文档,在Java Swing应用程序中创建在线帮助-使用pdf用户文档
  9. [CSS3] touch-action设置移动端拖动行为
  10. CSS动画效果构成分析