题目链接:绝世好题

暴力就不用说了,和lis神似,O(n2)妥妥的挂掉,但可以得大部分分(好像是90,80)...

考虑优化,来一发非正解的优化:

#include<bits/stdc++.h>
using namespace std;
const int N=101000;
int n,a[N],f[N],ans,tot;
priority_queue<pair<int,int> >q;
struct gg
{
int x,y;
}b[N];
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
inline int dfs(int x)
{
if(q.empty()) return 0;
int x1=q.top().first;
int x2=q.top().second;
if((x&x2)==0){b[++tot].x=x1;b[tot].y=x2;q.pop();return (dfs(x));}
else return x1;
}
int main()
{
// freopen("1.in","r",stdin);
n=read();
for(register int i=1;i<=n;++i) a[i]=read();
for(register int i=1;i<=n;++i)
{
tot=0;
f[i]=dfs(a[i])+1;q.push(make_pair(f[i],a[i]));
ans=max(ans,f[i]);
for(register int j=1;j<=tot;++j) q.push(make_pair(b[j].x,b[j].y));
}
printf("%d",ans);
return 0;
}

其实优化很显然,我们用大根堆维护一个最大的f[j](j<i)和他的权值,每次更新i时,从大跟堆中弹出来最大的,检验是否符合条件,不符合再弹,其实最坏的复杂度还是O(n2logn)但考虑到数据不会正好卡,且每次查询的第一个最大的,大概率会符合条件,所以...就过了;

这里要说的不是暴力有多优秀,而是我们在优化某些算法时,考虑多枚举了那些无用的元素,想办法将他剪掉就可以了,尽量让电脑做有用功...

之后考虑正解,是与二进制有关的,这也是我第一次有点认真的啃二进制的知识...

我们思考一个数i,它的前继j和他&不为0,也就是说,i和j在二进制位上,至少有一个位上两个都是1,那我们就可以将信息放在这一位上,因为我们可以查询i的每一位,为1,就可以将上一个距离他最近的那一位也为1的j转移过来.可以用f[i]表示在当前状态下,第i个数为1的数的最长序列长度.

考虑过转移,之后考虑怎么更新f数组。对于i我们在各个为1的位上去个max作为它的前继,那怎么将第i个数的长度最长为k记录下来呢?我们可以思考之后的数如果将i作为前继,那么必须和i有一个位上都为1,那这就好办了,我们在i为1的每一个位上都更新成刚才取得max,这样状态就记录下来...

#include<bits/stdc++.h>
using namespace std;
int n,f[35],s1,s,ans;
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
int main()
{
freopen("1.in","r",stdin);
n=read();
for(register int i=1;i<=n;++i)
{
int x=read();s1=x;s=0;
for(register int j=1;s1;++j)
{
if(s1&1) s=max(s,f[j]);
s1>>=1; //对所有为1的位取max作为前继
}
s1=x;
for(register int j=1;s1;++j)
{
if(s1&1) f[j]=s+1; //对所有为1的位更新成当前的最大值.
s1>>=1;
}
}
for(register int i=1;i<=32;++i) ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}

绝世好题(DP)的更多相关文章

  1. bzoj 4300: 绝世好题 dp

    4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  2. 【bzoj4300】绝世好题 dp

    题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入 输入文件共2行. 第一行包括一个整数n. 第二行包括n个 ...

  3. bzoj 4300 绝世好题——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ ...

  4. BZOJ4300:绝世好题(DP)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  5. 【洛谷】4310: 绝世好题【二进制DP】

    P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入输出格式 输入格式: 输入文件共2行 ...

  6. BZOJ-4300 绝世好(蛋疼)题 DP(递推)

    翻zky学长的blog时翻出来的..... 4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 736 Solved: 393 [Sub ...

  7. BZOJ 4300: 绝世好题 动态规划

    4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...

  8. 【递推】BZOJ 4300:绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 564  Solved: 289[Submit][Status][Discuss] ...

  9. P4310 绝世好题

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

随机推荐

  1. FastAPI(5)- get 请求 - 查询参数 Query Parameters

    什么是查询参数? http://127.0.0.1:8000/get?name=xxx&age=18 http://127.0.0.1:8000/get?age=18&name=xxx ...

  2. SpringCloudAlibaba - 整合 Nacos 实现服务注册与发现

    目录 前言 环境 Nacos是什么? 服务发现原理 搭建 Nacos Server Nacos Server 下载地址 Nacos Server 的版本选择 运行 Nacos Server Nacos ...

  3. TP5用join进行查询出来后的循环id都是一样的

    这是因为join将两个表的所有字段都查询,id冲突了,所以需要设置名,或指定选择一个表的id 用field('a.*')

  4. 【TP3.2.3】根据字段统计条数

    // 省份查询 $province = M('hospital') -> field('area as label,count(*) as value') -> group('area') ...

  5. 深入xLua实现原理之C#如何调用Lua

    本文主要是探讨xLua下C#调用Lua的实现原理,有关Lua如何调用C#的介绍可以查看深入xLua实现原理之Lua如何调用C# C#与Lua数据通信机制 无论是Lua调用C#,还是C#调用Lua,都需 ...

  6. Shell系列(2)- 脚本执行方式

    创建shell脚本 [root@localhost sh]# vim hello.sh  shell脚本必须用.sh,同时方便文件管理 #!/bin/bash:shell文件第一行必须是这个,声明这个 ...

  7. P4756-Added Sequence【斜率优化】

    正题 题目链接:https://www.luogu.com.cn/problem/P4756 题目大意 给出序列\(a\),设\(f(l,r)=|\sum_{i=l}^ra_i|\). \(m\)次询 ...

  8. PyTorch固定参数

    In situation of finetuning, parameters in backbone network need to be frozen. To achieve this target ...

  9. windows使用VS编译python源码

    使用VS2021编译python源码 说明,使用VS2019也是可以的. 环境准备 对于VS2019首要要安装必要的环境 到python官网下载源码压缩包以及解压(红色箭头任选一个都行) 打开下载好的 ...

  10. 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降

    1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...