BZOJ4300 绝世好题

来源:互联网 发布:淘宝千人千面怎么用 编辑:程序博客网 时间:2024/04/28 01:40
思路

f[i]为满足题目的序列中的最后一个数的第i位为1的长度
那么只需要找到当前数加入某些序列能得到的最长的长度
再用最长长度去更新f[i]即可

#include <cstdio>using namespace std;template <class T>T Max(const T &a , const T &b) {return a > b ? a : b;}const int SN = 100000 + 10;int f[SN], n, a[SN], ans;void Read(int &x) {    int in = 0,f = 1;char ch = getchar();    while(ch<'0' || ch>'9') {if(ch=='-') f = -1; ch = getchar();}    while(ch>='0' && ch<='9') {in = in*10+ch-'0';ch = getchar();}    x = in*f;}int main() {    Read(n);    for(int i = 1; i <= n; i++) Read(a[i]);    for(int i = 1; i <= n; i++) {        int t = a[i],k = 1,tmp = 0;        while(t) {            if(t & 1) tmp = Max(tmp, f[k]+1);            t >>= 1;            k++;        }        t = a[i], k = 1;        while(t) {            if(t & 1) f[k] = tmp;            t >>= 1;            k++;        }        ans = Max(ans , tmp);    }    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击