异或序列 [set优化DP]
\(\mathcal{Description}\)
有一个长度为 \(n\)的自然数序列 \(a\),要求将这个序列分成至少 \(m\) 个连续子段
每个子段的价值为该子段的所有数的按位异或
要使所有子段的价值按位与的结果最大,输出这个最大值
\(T\)组询问
\(T\leq 10,n,m\leq 1000,a_i\leq 2^{30}\)
\(\mathcal{Solution}\)
实际上数据范围可开大很多
我们贪心的一位一位的确定最终答案,即看当前考虑的位能否为\(1\)
记\(s_i\)表示前\(i\)个数的异或和,\(\bigoplus\)表示异或
设当前考虑到了第\(b\)位
令\(res=ans|(1<<b)\)
一段区间\([j+1,i]\)如果是一个合法的区间,可以得到
\(\left(s_i\bigoplus s_j\right)\&res=res\)
于是我们得到了一个\(n^2log\)的\(DP\)方程
\(f_i=max{f_i,f_j+1}\)其中\(\left(s_i\bigoplus s_j\right)=res\)
枚举位是\(log\)的,这样就可以\(AC\)此题了
实际这个\(DP\)可以进一步优化
\(\left(s_i\bigoplus s_j\right)\&res=res\)可以推出
\(\left(s_i \& res\right)\bigoplus \left(s_j\& res\right)=res\)
\(\Rightarrow s_i \& res=\left(s_j\& res\right)\bigoplus res\)
即要将\(s_i\)到\(s_j\)这段作为一个子段必须满足上面的条件
因为题目是至少\(m\)段,所以分的越多越好
则我们可以考虑完\(s_i\)的最优答案后将\(s_i\bigoplus res\)作为第一关键字存进\(set\)
\(f_i=find(s_i\bigoplus res)\)
这样一次转移就是\(log\)的
复杂度为\(nlog^2\)
\(\mathcal{Code}\)
/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年10月26日 星期六 09时18分19秒
*******************************/
#include <cstdio>
#include <fstream>
#include <cstring>
#include <set>
#define mp make_pair
using namespace std;
const int maxn = 2003;
//{{{cin
struct IO{
template<typename T>
IO & operator>>(T&res){
res=0;
bool flag=false;
char ch;
while((ch=getchar())>'9'||ch<'0') flag|=ch=='-';
while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
if (flag) res=~res+1;
return *this;
}
}cin;
//}}}
int n,m,T,ans;
int a[maxn],s[maxn];
set < pair<int,int> > v;
set < pair<int,int> > :: iterator it,nx;
//{{{solve
void solve (int x)
{
int res=ans|(1<<x);
bool flag;
v.clear();
for (int i=1;i<=n;++i){
int val=s[i]&res;
v.insert(mp(val,0));
nx=it=v.lower_bound(mp(val,0));
++nx;
while (nx!=v.end()&&nx->first==val){
v.erase(it);
it=nx,++nx;
}
if (it->second==0){
if (val==res){
v.insert(mp(val^res,1));
if (i==n) flag=it->second+1>=m;
}
}
else{
v.insert(mp(val^res,(it->second)+1));
if (i==n) flag=it->second+1>=m;
}
}
if (flag) ans=res;
}
//}}}
int main()
{
cin>>T;
while (T--){
cin>>n>>m;
ans=0;
for (int i=1;i<=n;++i){
cin>>a[i];
s[i]=s[i-1]^a[i];
}
for (int i=29;~i;--i) solve(i);
printf("%d\n",ans);
}
return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
异或序列 [set优化DP]的更多相关文章
- CF 1150 D Three Religions——序列自动机优化DP
题目:http://codeforces.com/contest/1150/problem/D 老是想着枚举当前在给定字符串的哪个位置,以此来转移. 所以想对三个串分别建 trie 树,然后求出三个t ...
- 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)
传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...
- 【bzoj3675】[Apio2014]序列分割 斜率优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6835179.html 题目描述 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列 ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- BZOJ 3675 APIO2014 序列切割 斜率优化DP
题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点
容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...
- 最长子序列(线性DP)学习笔记
子序列和子串不一样.子串要求必须连续,而子序列不需要连续. 比如说\(\{a_1,a_2\dots a_n\}\),他的子串就是\(\{a_i,a_{i+1},\dots, a_j|1\leq i\l ...
- HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...
随机推荐
- .net web.config中配置字符串中特殊字符的处理
https://www.cnblogs.com/zzmzaizai/archive/2008/01/30/1059191.html 如果本身字符串中有特殊字符,如分号,此时就需要用单引号整体包裹起来, ...
- Vs2017添加.NET Standard项目出现黄色未引用的SDK
项目打开文件夹位置,按住shift键,执行dotnet restore命令
- kafka(五) 流式处理 kafka stream
参考文档: http://www.infoq.com/cn/articles/kafka-analysis-part-7?utm_source=infoq&utm_campaign=user_ ...
- [Beta]Scrum Meeting#3
github 本次会议项目由PM召开,时间为5月8日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 改进界面 改进界面 bh ...
- VLC搭建RTSP服务器
实时流协议 RTSP 是在实时传输协议的基础上工作的,主要实现对多媒体播放的控制.用户对多媒体信息的播放.暂停.前进和后退等功能就是通过对实时数据流的控制来实现的. 而这些播放控制功能的实现不仅需要多 ...
- 解析生效测试方法 执行命令 ping 域名 得不到 IP 主要有如下几个原因:
https://help.aliyun.com/knowledge_detail/39834.html dig https://cloud.tencent.com/document/product/3 ...
- 安装MySQL Server
之前安装了MySQL Workbench 8.0 CE,现在来安装MySQL Server. 点击 add next next next 完成 MySQL安装包地址: 链接:https://p ...
- Fiddler抓包_次要功能和第三方插件
1.替换HTTP Request Host 应用场景:进行开发时,线上去测试跳转调试 替换命令:urlreplace news.baidu.com www.baidu.com: 清除命令:urlrep ...
- exe4j 打包jar包程序,inno setup complier打包所有
关于库: jar包中对于引用第三方库的话,需要再exe4j中引用. rxtx http://rxtx.qbang.org/wiki/index.php/Download
- Qt开发经验小技巧51-60
在某些http post数据的时候,如果采用的是&字符串连接的数据发送,中文解析乱码的话,需要将中文进行URL转码. QString content = "测试中文"; Q ...