天天看點

[bzoj 4300]絕世好題

給定一個長度為n的數列ai,求ai的子序列bi的最長長度,滿足bi&bi-1!=0(2<=i<=len)。

這道題它的(名字很。。。)思路挺巧的吧,xgc大佬秒A啊,太強了。我之後想了一會才會,也不算太難。看到這種位運算的題就應該往二進制方向去想,發現a[i]轉為二進制後隻有30位,f[i]表示目前這個數以二進制中的第i位(這個位肯定為1了)為結束的最長長度,那方程就很容易yy出來了,具體看代碼,主要還是靠&運算的特殊性質。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a[];
int f[];
int main()
{
    int n,ans=;
    scanf("%d",&n);
    for(int i=;i<=n;i++)
    {
        int wy=;
        scanf("%d",&a[i]);
        for(int j=;j<=;j++)
        {
            if((a[i]&(<<j))!=)wy=max(wy,f[j]+);
        }
        for(int j=;j<=;j++)
        {
            if((a[i]&(<<j))!=)f[j]=max(f[j],wy);
        }
        ans=max(ans,wy);
    }
    printf("%d\n",ans);
    return ;
}