BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)
\(Description\)
\(Solution\)
首先处理\(a_i\)的前缀异或和\(s_i\)。那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\(s_i+s_i\ ^{\wedge}s_n\)。
虽然有个加,但依旧可以考虑按位计算。如果\(s_n\)的第\(k\)位为\(1\),那\(s_i\)的第\(k\)位为\(0\)或是\(1\)贡献都是\(2^k\)(贡献即\(s_i+s_i\ ^{\wedge}s_n\)在第\(k\)位上是否为\(1\));如果\(s_n\)的第\(k\)位为\(0\),那么\(s_i\)第\(k\)位为\(0\)则贡献为\(0\),为\(1\)则贡献为\(2*2^k\)。
\(n\)就是指我们当前处理的前缀是\(a[1...n]\)。然后从高到低枚举每一位\(k\),如果\(s_n\)在这一位为\(1\),显然答案一定可以得到\(2^k\)的贡献;否则\(s_n\)在这一位为\(0\),我们应尽量让分割位置\(i\)满足\(s_i\)在第\(k\)位为\(1\),也就是找一个\(n\)前面的位置\(i\)满足\(s_i\)在第\(k\)位为\(1\),如果找得到,答案就可以得到\(2^{k+1}\)的贡献,并限制了\(s_i\)的第\(k\)位为\(1\)。
继续枚举更低位\(k'\)时,在第二种情况\(s_i\)不仅要满足\(s_i\)在第\(k'\)位为\(1\),还要满足之前的第\(k\)位为\(1\),也就是找是否存在\(s_i\)第\(k,k'\)位同时为\(1\)的\(n\)前面的位置\(i\)。
之后同理。
也就是说我们要求是否存在\(i\leq n\),\(s_i\)的第\(k\)位为\(1\)且前\(k\)位都满足之前的限制(某些位必须为\(1\))。
不妨去求,第\(k\)位为\(1\)且满足限制的最靠前的位置\(i\),判断是否有\(i\leq n\)。
因为限制就是某些位必须为\(1\),其它位任意,也就是超集。所以用高维前缀和维护满足某种限制的集合中,最靠前的位置就可以了。
复杂度\(O(2^kk)\)。
//6576kb 1748ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=(1<<20)+5;
int s[300005],f[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
static int pw[30];
pw[0]=1;
for(int i=1; i<=21; ++i) pw[i]=pw[i-1]<<1;
int n=read(),mx=0;
memset(f,0x3f,sizeof f);
for(int i=1,t; i<=n; ++i)
s[i]=s[i-1]^read(), mx=std::max(mx,s[i]), f[s[i]]=std::min(f[s[i]],i);
int bit=1;
while(pw[bit]<=mx) ++bit;
for(int i=0,lim=1<<bit; i<bit; ++i)
for(int s=0; s<lim; ++s)
if(!(s&pw[i])) f[s]=std::min(f[s],f[s|pw[i]]);
for(int i=1; i<=n; ++i)
{
int ans=0,t=0;
for(int j=bit-1; ~j; --j)
if(s[i]&pw[j]) ans|=pw[j];
else if(f[t|pw[j]]<=i) t|=pw[j], ans+=pw[j+1];//+= not |=...
printf("%d\n",ans);
}
return 0;
}
BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)的更多相关文章
- bzoj 5092 [Lydsy1711月赛]分割序列——高维前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 套路地弄一个前缀异或和,就变成 f[ i ]=max_{j=0}^{i} { s[ j ...
- bzoj 5092: [Lydsy1711月赛]分割序列
5092: [Lydsy1711月赛]分割序列 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 219 Solved: 100[Submit][Stat ...
- bzoj 5092 [Lydsy1711月赛]分割序列 贪心高维前缀和
[Lydsy1711月赛]分割序列 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 213 Solved: 97[Submit][Status][Dis ...
- 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 ...
- 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 ...
- bzoj 5092 分割序列 —— 高维前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 首先,处理出异或前缀和 s[i],i 位置的答案就是 s[j] + s[j]^s[i] ...
- bzoj 5094 [Lydsy1711月赛]硬盘检测 概率dp
[Lydsy1711月赛]硬盘检测 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 273 Solved: 75[Submit][Status][Dis ...
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- BZOJ 5093[Lydsy1711月赛]图的价值 线性做法
博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...
随机推荐
- 再也不用c++的string了
今天打比赛,觉得写法没错,但死活过不了大样例.调试时发现用cin读入一行臭长臭长的string类型变量时出锅了,原来几千个字符就读进来500个,导致一直WAWAWAWAWA. 最后yyj神犇帮我就删掉 ...
- Python中如何设置输出文字的颜色
一.语法 1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程 开头部分: \033 ...
- Fiddler--Composer
Composer选项卡支持手动构建和发请求:也可以在Session列表中拖拽Session放到Composer中,把该Session的请求复制到用户界面: 点击"execute"按 ...
- NOI-OJ 2.2 ID:1696 逆波兰表达式
思路 很容易看出规律,一个运算符出现,其后就一定需要左值和右值,而左值和右值有可能还是运算符,这就需要继续递归.递归终止的条件就是遇到数字. 逆波兰表达式其实是构造成了一颗二叉树 例程 #includ ...
- django - 总结
0.html-socket import socket def handle_request(client): request_data = client.recv(1024) print(" ...
- web全栈应用【爬取(scrapy)数据 -> 通过restful接口存入数据库 -> websocket推送展示到前台】
作为 https://github.com/fanqingsong/web_full_stack_application 子项目的一功能的核心部分,使用scrapy抓取数据,解析完的数据,使用 pyt ...
- Entity Framework查询
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...
- day 18 - 1 正则与 re 模块
正则表达式 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个 “规则字符串”,这个 “规则字符串” 用来表达对字符串的一种过滤逻辑. 我 ...
- docker时间和本地时间不一致的问题
前言: 在本地执行date 和登录docker后的date显示的时间不一致,差一天多,不是8个小时 参考:戳这儿 先重启,查看后发现差8个小时 用里面cp localtime 再重启还是差8个小时 试 ...
- css之字体的引用
font-family 属性设置文本的字体系列. font-family 属性应该设置几个字体名称作为一种"后备"机制,如果浏览器不支持第一种字体,他将尝试下一种字体. 注意: 如 ...