首页 > 其他 > 详细

BZOJ4300: 绝世好题

时间:2015-11-18 19:41:06      阅读:307      评论:0      收藏:0      [点我收藏+]

Description

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

 

Input

输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。
 

 

Output

输出文件共一行。
包括一个整数,表示子序列bi的最长长度。
 

 

Sample Input

3
1 2 3

Sample Output

2

HINT

 

对于100%的数据,1<=n<=100000,ai<=10^9。

 

设f[i][j]表示前i个数,选出的最后一个数的第j位为1,最多选多少数。

可以用个滚动数组。

技术分享
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c==-) f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-0;
    return x*f;
}
const int maxn=100010;
int n,A[maxn],ans,f[32];
int main() {
    n=read();
    rep(i,1,n) A[i]=read();
    rep(i,1,n) {
        int res=0;
        rep(j,0,31) if(A[i]>>j&1) res=max(res,f[j]);
        rep(j,0,31) if(A[i]>>j&1) f[j]=res+1;
        ans=max(ans,res+1);
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

BZOJ4300: 绝世好题

原文:http://www.cnblogs.com/wzj-is-a-juruo/p/4975544.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!