点此看题面

大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\)。

位运算+\(DP\)

考虑设\(f_i\)表示以第\(i\)个数为结尾所能得到的合法子序列的最长长度

则一个数能从另一个数那里转移,当且仅当这两个数按位与的值不为\(0\)。

考虑按位与的值不为\(0\),实际意义就是二进制下存在至少一位上这两个数都是\(1\)。

那么,我们可以枚举两个位置,然后枚举二进制下一位判断是否可以转移。

这样就可以轻松得出一个复杂度比暴力还劣的\(O(n^2log\ a_i)\)的解法。

实际上,在刚才的转移中其实有许多无意义转移。

则我们需要知道,怎样的转移是有意义的。

假设有\(l,r(1\le l<r\le n)\)满足\(a_l\)与\(a_r\)二进制下第\(j\)位上都为\(1\)。

则根据前面的转移,\(r\)必然可以由\(l\)转移,则\(f_r\)至少为\(f_l+1\),简而言之就是\(f_r>f_l\)。

也就是说,对于二进制下第\(k\)位为\(1\)的任何的位置\(i\)(\(i>r\)),从\(l\)转移显然是无意义的。

其实,对于每一个\(j\),只有从二进制下这一位为\(1\)的最靠右的位置转移才是有意义的。

因此,我们设\(g_j\)表示二进制下第\(j\)位为\(1\)的最右位置,转移方程即为(转移时要满足\(a_i\)二进制下第\(j\)位为\(1\)):

\[f_i=max_{j=1}^{30}f_{g_j}+1
\]

转移完之后,我们再次枚举每一个满足\(a_i\)二进制下第\(j\)位为\(1\)的\(j\),然后更新\(g_j=i\)即可。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define Gmax(x,y) (x<(y)&&(x=(y)))
using namespace std;
int n,a[N+5],f[N+5],g[N+5];
int main()
{
RI i,j,ans=0;for(scanf("%d",&n),i=1;i<=n;++i) scanf("%d",a+i);
for(i=1;i<=n;++i)
{
for(j=30;~j;--j) a[i]>>j&1&&Gmax(f[i],f[g[j]]);++f[i];//转移
for(j=30;~j;--j) a[i]>>j&1&&(g[j]=i);Gmax(ans,f[i]);//更新
}return printf("%d",ans),0;//输出答案
}

【BZOJ4300】绝世好题(位运算水题)的更多相关文章

  1. 蓝桥杯---汉字取首字母(位运算 & 水题)

    确实题目虽然有点水,但是开始的时候好像还真的没有想到怎么提取出这个编号一不小心感觉可以可以用unsigned char 这种类型,直接转为16进制,但是之后发现虽然第一次在codeblock中还行,但 ...

  2. [poj2777] Count Color (线段树 + 位运算) (水题)

    发现自己越来越傻逼了.一道傻逼题搞了一晚上一直超时,凭啥子就我不能过??? 然后发现cin没关stdio同步... Description Chosen Problem Solving and Pro ...

  3. 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)

    点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...

  4. bzoj5108 [CodePlus2017]可做题 位运算dp+离散

    [CodePlus2017]可做题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 87  Solved: 63[Submit][Status][Dis ...

  5. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  6. caioj 1000: [视频]整数运算[水题]

    题目大意:输入两个整数a和b,输出他们的和. 题解:水题不用题解,简单看一下就知道了-- 代码: #include <cstdio> int a, b; int main() { whil ...

  7. zoj--3870--Team Formation(位运算好题)

    Team Formation Time Limit: 3000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  8. zzulioj--1832--贪吃的松鼠(位运算好题)

    1832: 贪吃的松鼠 Time Limit: 3 Sec  Memory Limit: 2 MB Submit: 43  Solved: 7 SubmitStatusWeb Board Descri ...

  9. CodeForces 165E Compatible Numbers(位运算 + 好题)

    wo integers x and y are compatible, if the result of their bitwise "AND" equals zero, that ...

随机推荐

  1. 浅谈JavaScript--事件委托与事件监听

    事件监听 该方法用于向指定元素添加事件句柄(代码块),且不会覆盖已存在的事件句柄. 即可以向同一个元素添加同一个事件多次. 添加事件 语法: element.addEventListener(even ...

  2. Xuzhou Winter Camp 1C(模拟)

    #include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include ...

  3. Kotlin VS Java:基本语法差异

    Kotlin比Java更年轻,但它是一个非常有前途的编程语言,它的社区不断增长. 每个人都在谈论它,并说它很酷. 但为什么这么特别? 我们准备了一系列文章,分享我们在Kotlin开发Android应用 ...

  4. jsp内置对象request使用方法2

    <%@page import="java.text.SimpleDateFormat"%> <%@page import="java.util.Date ...

  5. [WebShow系列] Web浏览器最大化满屏及比例缩放方法

    如果要在大屏上展示,大屏所带电脑的浏览器应该处于满屏,此时就不会显示浏览器软件的边框了.个别浏览器在满屏状态下,某些边栏等还继续保留,此时应设置此浏览器的显示选项方可消除. 如果屏幕中的显示对象过小或 ...

  6. Exadata 12.2.1.1.0 Highlights

    突然发现,在中国农历新年的这几年里,Exadata 12.2版本已经发布了. 本起去docs.oracle.com上看看它的新特性,结果发现文档还没有更新: 下面是找到的一些资料,让我们来一睹为快吧: ...

  7. mathjax;latex

    \lfloor $\lfloor$ \rfloor $\rfloor$ \sum_{i=1}^{n} $\sum_{i=1}^{n}$ \mu $\mu$ \mid $\mid$ \Leftright ...

  8. ffmpeg文件生成m3u8文件及ts切片程序(一)

    ffmpeg文件生成m3u8文件及ts切片程序(一) 实现目标:输入本地文件,实现m3u8切片,功能点请看注释,注意:注释很重要. 参考: http://www.cnblogs.com/mystory ...

  9. Excel2010如何实现隔行设置背景色

    当Excel表格中的数据很多,很有可能会出现看错行的现象,为防止看错行,可以隔行设置背景色.可以通过套用表格格式或者条件格式来达到隔行变色的效果 方法一:通过套用表格格式 1.选中要处理的单元格或者列 ...

  10. 让javascript加载速度倍增的方法(解决JS加载速度慢的问题)

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含的方式,让javascript加载速度 ...