bzoj 4300 绝世好题
4300: 绝世好题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2012 Solved: 1061
[Submit][Status][Discuss]
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
1 2 3
Sample Output
2
HINT
n<=100000,ai<=2*10^9
PS:今天做了个绝世好题,晚上加鸡腿?
思路:2个数要&为0,说明他们都二进制所有位置中,至少有一个为0,我们用dp[i]表示当前这个数二进制的第i位形成的最长序列
如果当前这个数与(1<<j)&为1,说明这个数可以与前面的dp[j]为放在一个序列中,然后这个数的的二进制位置为1的位置赋值与以这个点为结束的最大序列
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll a[100005]; 6 int dp[50]; 7 8 int main(){ 9 int n; 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++){ 12 scanf("%lld",&a[i]); 13 } 14 int Max=0; 15 for(int i=1;i<=n;i++){ 16 int tmp=0; 17 for(int j=0;j<=31;j++){ 18 if(a[i]&((1LL)<<j)) 19 tmp=max(tmp,dp[j]+1); 20 } 21 for(int j=0;j<=31;j++){ 22 if(a[i]&((1LL)<<j)) 23 dp[j]=tmp; 24 25 } 26 Max=max(Max,tmp); 27 } 28 cout<<Max<<endl; 29 }