题目:绝世好题

暴力 dp

显然 \(O(n^2)\) 转移即可。

单调队列优化

观察到只有某二进制位两个数都为 \(1\) 时才能转移,因此我们把每个二进制位开一个单调队列,然后对于一个数 \(a\) ,找到它是 \(1\) 的二进制位并选其单调队列的队头进行转移,在这之后把这个数加入符合要求的单调队列中即可。

因为我懒 因为没有弹出元素操作并且多个 log 无伤大雅,所以单调队列可以用优先队列代替。

单调队列的时间是 \(O(n \log n)\),要是懒的话用优先队列 \(O(n \log n \log n)\) 依然可以过。

代码就不写了。

二进制优化

定义 \(f[i]\) 为在二进制下以第 \(i\) 位为1结尾的最长序列长度。

我们在 dp 时,先找出 \(a\) 哪一个二进制位为 \(1\) ,就说明这一位为结尾的可以转移过来,记录下转移最大值。记录之后再找出 \(a\) 哪一个二进制位为 \(1\) ,把转移的最大值继续转移下去即可。

#include <bits/stdc++.h>
using namespace std;
int n,a,f[40],ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
int tmp=0;
for(int j=0;j<=32;j++)
{
if((a>>j)&1)
{
tmp=max(tmp,f[j]);
}
}
for(int j=0;j<=32;j++)
{
if((a>>j)&1)
{
f[j]=max(f[j],tmp+1);
}
ans=max(ans,f[j]);
}
}
cout<<ans;
return 0;
}

时间 \(O(n \log n)\) 。

本质是滚动数组充当了我们单调队列的作用,因为它会存下某一位结尾的最大长度,而不用我们手动去找,并且还省空间。

Luogu P4310 绝世好题 题解 [ 绿 ] [ 线性 dp ] [ 单调队列优化 ] [ 二进制优化 ]的更多相关文章

  1. Mowing the Lawn【线性dp + 单调队列优化】

    题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...

  2. P4310 绝世好题

    P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 说明 对于100%的数据,1<=n ...

  3. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  4. 刷题总结——生日礼物(bzoj1293单调队列)

    题目: Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠, ...

  5. 刷题总结——Cut the Sequence(POJ 3017 dp+单调队列+set)

    题目: Description Given an integer sequence { an } of length N, you are to cut the sequence into sever ...

  6. 刷题总结——烽火传递(单调队列+dp)

    题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...

  7. HDU 5945 题解(DP)(单调队列)

    题面: Fxx and game Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) T ...

  8. luogu P3657 (NOIP2017) 跳房子(二分+DP+单调队列)

    题面 传送门 分析 显然答案有单调性,可以二分答案,设当前二分值为g,根据题意我们可以求出跳跃长度的范围[l,r] 考虑DP 子状态: dp[i]表示跳到第i个点时的最大和 状态转移方程 \(dp[i ...

  9. P4310 绝世好题 按位DP

    这名字可海星\(OvO\) 思路:\(DP\) 提交:2次(\(zz\)我竟然把三目运算符写错了\(QwQ\)) 题解: 按位进行\(DP\):\(f[i]\)表示结尾的数字包括\(1<< ...

  10. Luogu 4310 绝世好题

    BZOJ 4300 先把这堆东西丢到博客里,以后再复习. 首先考虑暴力的$dp$,设$f_i$表示以$i$结尾的满足条件的序列的最长长度,有: $f_i = max(f_j) + 1$    $j & ...

随机推荐

  1. 用OpenResty搭建高性能服务端

    相关链接:https://github.com/openresty/lua-nginx-module OpenResty 简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web ...

  2. HarmonyOS Next 入门实战 - 创建项目、主题适配

    ​开发一个简单的demo,其中涉及一些鸿蒙应用开发的知识点,其中涉及导航框架,常用组件,列表懒加载,动画,深色模式适配,关系型数据库等内容,在实践中学习和熟悉鸿蒙应用开发. ​​ ​​ 首先下载并安装 ...

  3. ZCMU-1179

    我的错误: 明知道是大数问题但不是不想写数组或者字符串的结构. 思路 网上查阅后发现可以使用JAVA的大数类型做. 若不使用JAVA则就是整型数组或者字符串的情况. 将a^b结果放在数组当中,实时更新 ...

  4. 内网穿透之http代理服务器

    在公网访问内网http服务可以用内网穿透工具,例如frp和nps等优秀工具.但我发现这类工具会在服务器启动不止一个端口,对于有些网络审查来说很容易发现在进行内网穿透.因此我想是否可以只在服务器启动一个 ...

  5. 8.mysql表分区

    MySQL表分区 表分区是将⼀个表的数据按照⼀定的规则⽔平划分为不同的逻辑块,并分别进⾏物理存储,这个规则就叫做分区函数,可以有不同的分区规则 5.7可以通过show plugins语句查看当前MyS ...

  6. 浅谈LINUX中/DEV/VDA1文件满了解决方法

    1. 先查看内存使用情况 df -h 1 2. 进入/dev/vdal的磁盘挂载的目录 /,查看各个文件占用大小 cd / du -sh * 1 2 注意:进入那个比较大的文件,我这里发现var这个文 ...

  7. jsch文件复制(拷贝)

    public void copyFile(Session session, String sourceFile, String destinationFile) { ChannelExec chann ...

  8. 龙哥量化:代写技术指标,通达信ZIG函数优化改进之字转向,高点用最高价,低点用最低价

    如果您需要代写技术指标公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 N:=50; A1:ZIG(3,N/10); 代码只有两行,参数是50,表示涨幅5%,在调参数时 ...

  9. Python中导入模块的import命令的语法

  10. 比较IDEA与Eclipse

    在IDEA的项目中,聚合工程或普通的根目录是工程(Project).它的每一个子模块(Module),都可以使用独立的JDK和Maven.下面的子工程称为模块(Module),子模块(Module)之 ...