BZOJ 4300 绝世好题

2023-11-22 21:10
文章标签 bzoj 好题 绝世 4300

本文主要是介绍BZOJ 4300 绝世好题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4300: 绝世好题

Description

给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-!=0(2<=i<=len)。

Input

输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。

Output

输出文件共一行。
包括一个整数,表示子序列bi的最长长度。

Sample Input

3
1 2 3

Sample Output

2

HINT

n<=100000,ai<=2*10^9


  这道题目挺有趣的,当时特别蒙(但我看了题解,特别不老实啊~)。

  DP题,但转移并不像你所想的那样生猛。

  如果我们用图的方式去思考它,就会发现很多神奇的东西。因为DP满足拓扑序,事情按着顺序来,所以很多时候都能这样思考。对于此题,因为bit<30,所以O(nlogai)绰绰有余。

status before 

the number

we consider

+1status after
f(0)-->1-->f(0)
f(1) 0 f(1)
f(2)-->1-->f(2)


  最后说一句,如果去掉前导0,那么速度将会快上很多很多……

  亲测:112ms--〉80ms

 

 1 /**************************************************************
 2     Problem: 4300
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:92 ms
 7     Memory:1212 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 const int N = 100010;
12 int n, f[N], ans;
13 inline int max(int a,int b) {return a>b?a:b;}
14 int main() {
15     scanf("%d",&n);
16     for( int x,temp,i = 1; i <= n; i++ ) {
17         scanf("%d",&x);
18         temp=0;for( int j = 0; j <= 30; j++ ) if((x>>j)&1) temp=max(temp,f[j]);
19         temp++;for( int j = 0; j <= 30; j++ ) if((x>>j)&1) f[j]=max(f[j],temp);
20     }
21     for( int j = 0; j <= 30; j++ ) ans=max(ans,f[j]);
22     printf("%d\n",ans);
23     return 0;
24 }
DP(位运算)

 

 

 

转载于:https://www.cnblogs.com/Doggu/p/bzoj4300.html

这篇关于BZOJ 4300 绝世好题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412928

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

HDU5521 Meeting([好题]最短路径)

题意:一个人在1位置,另一个在n位置,俩人要见面,然后给出m个集合,告诉集合的城市之间的距离都是t。然后问最短路 解法:边太多,直接邻接表是存不下的,所以要换一个存储方式,存与边关联的点,与点关联的边。然后最短路用堆优化的dij算法。还有一点值得注意的是,一个集合只需要跑一次就可以了,因为是最短路跑过来的,集合里都已经是最短的了 #include<bits/stdc++.h>using nam

Codeforces Round #329 (Div. 2) B. Anton and Lines ([好题] 计算直线在区间是否有交点)

题目链接 题意:给出n个条直线,然后在指定的区间(x1,x2)是否有直线的交点存在。 解法:一:闭区间,首先把区间略微调小。 二:计算直线在x1,x2上的交点y坐标,以及直线的id,然后按照y值,id值排序,最后判断第x1,x2左右两边的第i个点是不是同一直线的,如果不是,就存在交点。 #include<bits/stdc++.h>using namespace std;const i

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

[M二分] lc153. 寻找旋转排序数组中的最小值(二分+边界情况+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:153. 寻找旋转排序数组中的最小值 2. 题目解析 一道不错的二分题目。有两种写法,但两种写法的边界情况各不相同,需要考虑清楚。 思路: 数组中可能是完全升序的,也可能是前半段完全大于后半段的旋转的。升序的很简单,只需要考虑 nums[0] < nums.back() 即可。关注这个旋转的,可知,nums[

[M二分] lc162. 寻找峰值(二分+思维+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:162. 寻找峰值 题单: 二分算法(二分答案/最小化最大值/最大化最小值/第K小) 其他 2. 题目解析 本题是而二分法的一个经典变种,也说明了一点: 当数组即便无序时,只要其满足二分性质,则也可以进行二分。 思路: 首先,本题答案一定存在。因为在两侧边界是属于 -inf,负无穷的高度。那么只要存