bzoj 4300: 绝世好题

Description

给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。

solution

简单题
相与不为0,意味着有一个位置为1,所以维护含有每一个二进制位的最大长度,然后转移就枚举 \(a[i]\) 的所有为1的位置,取max即可

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=100005;
int a[N],n,f[N],g[N],ans=0;
void work()
{
   scanf("%d",&n);
   for(int i=1;i<=n;i++)scanf("%d",&a[i]);
   for(int i=1;i<=n;i++){
      for(int j=0;j<=30;j++)
         if(a[i]&(1<<j))f[i]=Max(f[i],g[j]+1);
      for(int j=0;j<=30;j++)
         if(a[i]&(1<<j))g[j]=Max(g[j],f[i]);
      if(f[i]>ans)ans=f[i];
   }
   printf("%d\n",ans);
}
 
int main()
{
    work();
    return 0;
}
posted @ 2017-10-25 12:12  Hxymmm  阅读(80)  评论(0编辑  收藏  举报