绝世好题 BZOJ

来源:互联网 发布:淘宝手机上如何开网店 编辑:程序博客网 时间:2024/04/29 00:15

题目传送门

思路:这个题如果用O(N^2)的算法的话会超时,所以我们可以对每一个数字的每一位数字进行操作,这样可以在O(N*logN)的时间复杂度中完成。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>#define MAXN 100010#define MAXE 40#define INF 0x7ffffff#define MOD 100003#define LL long long#define ULL unsigned long long#define pi 3.14159using namespace std;LL arr[MAXN];int f[MAXE];int main() {    std::ios::sync_with_stdio(false);    int n;    cin >> n;    for (int i = 0; i < n; ++i) {        cin >> arr[i];    }    int max_length = 0;    memset(f, 0, sizeof(f));    for (LL i = 0; i < n; ++i) {        int sum = 0;        for (LL j = 0; j <= 30; ++j) {            if (arr[i] & (1LL << j)) {                sum = max(sum, f[j] + 1);            }        }        for (int j = 0; j <= 30; ++j) {            if (arr[i] & (1LL << j)) {                f[j] = max(sum, f[j]);            }        }    }    for (int i = 0; i <= 30; ++i)        max_length = max(max_length, f[i]);    cout << max_length << endl;    return 0;}
原创粉丝点击