BZOJ 4300

先把这堆东西丢到博客里,以后再复习。

首先考虑暴力的$dp$,设$f_i$表示以$i$结尾的满足条件的序列的最长长度,有:

    $f_i = max(f_j) + 1$    $j < i $ $,$  $ a_j \& a_i \neq 0$

    $ans = max(f_i)$    $1 \leq i \leq n$

这样是$n^2$的。

考虑二进制意义下的按位与,如果要使这个运算的结果不为$0$的话,必须要有一位两个数都是$1$,那么我们可以考虑拆位进行$dp$,设$g_j$表示第$j$位是$1$结尾的最长的满足条件的序列的长度。对于每一个$i$,有:

    $f_i = max(g_j) + 1$   $0 \leq j \leq 32$  并且$a_i$的第$j$位为$1$。

    $g_j = max(f_i, g_j)$   $a_i$的第$j$位为$1$。

    $ans = max(f_i)$    $1 \leq i \leq n$

事实上在写的时候并没有必要把$f$开出来。

时间复杂度$O(nlog(Maxn))$。

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = 1e5 + ;
const int M = ; int n, a[N], f[M]; inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMax(int &x, int y) {
if(y > x) x = y;
} int main() {
read(n);
for(int i = ; i <= n; i++) read(a[i]); int ans = ;
for(int i = ; i <= n; i++) {
int now = ;
for(int j = ; j <= ; j++)
if((a[i] >> j) & ) chkMax(now, f[j]);
++now;
chkMax(ans, now);
for(int j = ; j <= ; j++)
if((a[i] >> j) & ) chkMax(f[j], now);
} printf("%d\n", ans);
return ;
}

Luogu 4310 绝世好题的更多相关文章

  1. 【洛谷】4310: 绝世好题【二进制DP】

    P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入输出格式 输入格式: 输入文件共2行 ...

  2. bzoj 4300: 绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi& ...

  3. BZOJ 4300: 绝世好题 动态规划

    4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...

  4. 【递推】BZOJ 4300:绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 564  Solved: 289[Submit][Status][Discuss] ...

  5. bzoj 4300: 绝世好题 dp

    4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  6. bzoj千题计划190:bzoj4300: 绝世好题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> # ...

  7. HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)

    HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...

  8. P4310 绝世好题

    P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 说明 对于100%的数据,1<=n ...

  9. 【BZOJ4300】绝世好题(动态规划)

    [BZOJ4300]绝世好题(动态规划) 题面 BZOJ Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=l ...

随机推荐

  1. L119

    A big collaboration is trying to understand diseases of the psycheDiseases of the psyche have always ...

  2. STL迭代器辅助函数——advance

    Advance(i, n) increments the iterator i by the distance n. If n > it it , the call has no effect. ...

  3. C++继承细节 -1

    为什么基类析构函数最好要使用 virtual 进行修饰? class A { private: ...... public: ~A(); A() {} }; class B : public A { ...

  4. myeclipse2014中如何安装freeMarker插件(支持ftl语法高亮)

    MyEcplise2014安装Freemarker插件(支持.ftl文件) 1.下载插件:http://sourceforge.net/projects/freemarker-ide/?source= ...

  5. 461. Hamming Distance Add to List

    // 快速法求1的个数 int BitCount2(unsigned int n) { unsigned ; ; n; ++c) { n &= (n -) ; // 清除最低位的1 } ret ...

  6. idea 创建maven工程(入门)

    转:http://blog.csdn.net/qq_32588349/article/details/51461182 1. 下载Maven 官方地址:http://maven.apache.org/ ...

  7. Redis底层探秘(四):整数集合及压缩列表

    整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含 整数值元素,并且这个集合的元素数量不多时,Redis就会使用郑书记和作为集合键的底层实现. 整数集合的实现 整数集合是red ...

  8. vue 链接

    https://www.jianshu.com/p/5d9b341d650f vue-cli入门(三)——人员管理实例 ps:如何创建vue-cli项目 https://www.v2ex.com/t/ ...

  9. Maven错误之 Check $M2_HOME environment variable

    Eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  10. 前端优化规范 webApp