[bzoj5092][乱搞]分割序列

2023-10-16 03:18
文章标签 分割 序列 乱搞 bzoj5092

本文主要是介绍[bzoj5092][乱搞]分割序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

题解

感觉这个套路以前没有玩过啊…
求出前缀异或和,然后就是要计算一个 m a x ( s [ j ] + s [ j ] ∧ s [ i ] ) max(s[j]+s[j]\land s[i]) max(s[j]+s[j]s[i])
不考虑别的,我们还是套路地从高位往低位考虑 s [ j ] s[j] s[j]
对于第i位是1的,显然s[j]的第i位是0是1都只会有 2 i 2^i 2i的贡献
对于是0的,我们当然希望s[j]的第i位是1来获得 2 i + 1 2^{i+1} 2i+1的贡献
如果朴素Tire的话我们需要在是1的地方往0和1的孩子搜,0就贪心往1走
也可以离线后建出Tire,把1的孩子并到0的孩子上,1的孩子不变
简单考虑怎么做
设一个 F [ S ] F[S] F[S]表示对于所有 S a n d T = S SandT=S SandT=S即S为T的子集的所有T的最早出现位置
可以用一个DP求出来
仍然从大往小扫,如果当前位是1就直接加上 2 i 2^i 2i贡献
否则我们看看之前确定要填1的位置再加上当前要填1的位置组成的 S S S中是否有一个 T T T出现在当前这个数的左边,是的话就加上 2 i + 1 2^{i+1} 2i+1并记录这里填了1,否则不做操作
因为其他位是否是1都不影响答案,不需要考虑

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline LL read()
{LL f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int stack[20];
inline void write(LL x)
{if(x<0){putchar('-');x=-x;}if(!x){putchar('0');return;}int top=0;while(x)stack[++top]=x%10,x/=10;while(top)putchar(stack[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(LL x){write(x);putchar('\n');}
const int MAXN=300005;
const int MAXM=1000005;
int f[8*MAXM],a[MAXN],n;
int bin[25];
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);bin[0]=1;for(int i=1;i<=22;i++)bin[i]=bin[i-1]<<1;n=read();memset(f,63,sizeof(f));for(int i=1;i<=n;i++)a[i]=read()^a[i-1],f[a[i]]=min(f[a[i]],i);for(int i=2*MAXM;i>=0;i--)for(int j=21;j>=0;j--)if(i&bin[j])f[i^bin[j]]=min(f[i^bin[j]],f[i]);pr2(a[1]);for(int i=2;i<=n;i++){int ans=0,now=0;for(int j=21;j>=0;j--){if(a[i]&bin[j])ans+=bin[j];else if(f[now|bin[j]]<=i)ans+=bin[j]*2,now|=bin[j];}pr2(ans);}return 0;
}

这篇关于[bzoj5092][乱搞]分割序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218645

相关文章

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Python如何将大TXT文件分割成4KB小文件

《Python如何将大TXT文件分割成4KB小文件》处理大文本文件是程序员经常遇到的挑战,特别是当我们需要把一个几百MB甚至几个GB的TXT文件分割成小块时,下面我们来聊聊如何用Python自动完成这... 目录为什么需要分割TXT文件基础版:按行分割进阶版:精确控制文件大小完美解决方案:支持UTF-8编码

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

使用Python实现批量分割PDF文件

《使用Python实现批量分割PDF文件》这篇文章主要为大家详细介绍了如何使用Python进行批量分割PDF文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、架构设计二、代码实现三、批量分割PDF文件四、总结本文将介绍如何使用python进js行批量分割PDF文件的方法

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect