BZOJ 4300: 绝世好题 二进制】的更多相关文章

对于每一个数字拆位,然后维护一个大小为 30 左右的桶即可. code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int mx[N]; int main() { // setIO("input"); int i,j,n,ans=0; scanf("%d&q…
HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. Output 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. Sample Input 3 1 2 3 Sample Output 2 Http HYSBZ:http://www.lydsy…
4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len).   Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai.   Output 输出文件共一行. 包括一个整数,表示子序列bi的最长长度.   Sample Input 3 1 2 3 Sample Output 2…
4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. Output 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. Sample Input 3 1 2 3 Sam…
4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 564  Solved: 289[Submit][Status][Discuss] Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. Output 输出文件共一行. 包括一个整数,表示子序列bi的…
4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Under two situations the player could score one point. ⋅1. If you touc…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4300 [题目大意] 给出一个序列a,求一个子序列b,使得&和不为0 [题解] 记录某个位置上为1的&序列长度的最长值,对于每个加入的数字, 更新每个数组. __builtin_ctz(x)函数用于求出x的二进制位数. [代码] #include <cstdio> #include <algorithm> int x,ans,res,n,a[40]; us…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ i ] != 0 的,也就是有至少1位公共的1:所以在30位上记录这一位是1的那些 a[ ] 中的 dp[ ] 最大值,就能转移了. #include<iostream> #include<cstdio> #include<cstring> #include<alg…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 记录一下 mx[j] 表示以第 j 位上是1的元素结尾的子序列长度最大值,转移即可. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,xm=; int n,a[xn],mx[xm],bin[x…
设f[i][j]表示数列到i为止最后一项第j位为1的最大子序列长度,每次从i-1中1<<j&a[i]!=0的位+1转移来 然后i维是不需要的,答案直接在dp过程中去max即可 #include<iostream> #include<cstdio> using namespace std; int n,f[35],ans; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') {…
呵呵呵呵 #include<bits/stdc++.h> #define INF 0x7fffffff #define LL long long #define N 100005 using namespace std; inline int ra() { ,f=; char ch=getchar(); ; ch=getchar();} +ch-'; ch=getchar();} return x*f; } ]; int main() { int n=ra(); ; i<=n; i++)…
http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; void read(int &x) { x=; char c=getchar(); while(!isdigit(c)) c=getchar(); +c-';…
P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 输入输出格式 输入格式: 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. 输出格式: 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. 输入输出样例 输入样例#1: 复制 3 1 2 3 输出样例#1: 复制 2 说明 对于100%的数据,1<=n<=100000,ai<=10^9.…
绝世好题 bzoj-4300 题目大意:题目链接. 注释:略. 想法: 二进制拆分然后用一个数组单独存一下当前答案即可. Code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define N 100010 using namespace std; int a[N],p[32],f[N],mx[32]; inline char nc() {st…
P4310 绝世好题 题目描述 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). 说明 对于100%的数据,1<=n<=100000,ai<=10^9. 错误日志: 没搞清 每一位的dp值如何更新记录数组 Solution 一个数 \(a\) 可以接在数 \(b\) 后面, 当他们在二进制下有相同位同为 \(1\) 时成立 这启发我们可以这样更新: 对于新的数 \(x\) 的每个 \(1\) 位,向前寻找一个最…
[BZOJ4300]绝世好题(动态规划) 题面 BZOJ Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=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…
BZOJ 4300 先把这堆东西丢到博客里,以后再复习. 首先考虑暴力的$dp$,设$f_i$表示以$i$结尾的满足条件的序列的最长长度,有: $f_i = max(f_j) + 1$    $j < i $ $,$  $ a_j \& a_i \neq 0$ $ans = max(f_i)$    $1 \leq i \leq n$ 这样是$n^2$的. 考虑二进制意义下的按位与,如果要使这个运算的结果不为$0$的话,必须要有一位两个数都是$1$,那么我们可以考虑拆位进行$dp$,设$g_…
bzoj4300绝世好题 题意: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0.n≤100000,ai≤10^9. 题解: 用f[i]表示当前二进制i为1的最长子序列长度.每次求所有((1<<i)&bi)==1的f[i]最大值max,将所有((1<<i)&bi)==1的f[i]变为max+1. 代码: #include <cstdio> #include <cstring> #include &l…
题目链接:绝世好题 暴力就不用说了,和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 r…
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2007]轮状病毒:找规律 + 高精: [BZOJ1003][ZJOI2006]物流运输:最短路 + DP: [BZOJ1004][HNOI2008]Cards:Burnside 引理 + DP: [BZOJ1005][HNOI2008]明明的烦恼:prufer编码 + 高精: [BZOJ1007][…
Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1120  Solved: 609 [Submit][Status][Discuss] Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. Output 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. Sa…
题意: n<=100000,ai<=2*10^9 思路:按二进制逐位考虑,只要有至少1位取and后为1就可以接下去 设dp[i]为第i位取and之后为1的最长的序列长度,意会一下 #include<cstdio> #include<iostream> typedef long long ll; using namespace std; #define MOD 1000000007 #define N 110000 ]; int main() { int n; scanf…
传送门 简单dp. 根据题目的描述. 如果数列bn{b_n}bn​合法. 那么有:bi−1b_{i-1}bi−1​&bi!=0b_i!=0bi​!=0,因此我们用f[i]f[i]f[i]表示数列b最后一位第i个二进制位为1的时候b数列的最长长度. 然后简单转移一下就行了. #include<bits/stdc++.h> #define N 100005 using namespace std; inline int read(){ int ans=0; char ch=getchar(…
BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Length 695765 Eolv 1000 Accepted 804 kb 0 ms 118 B 739478 Eolv 2463 Accepted 804 kb 0 ms 134 B 696662 Eolv 1968 Accepted 1272 kb 48 ms 137 B 739546 Eolv…
Translate:Sgu/126 126. 盒子 time limit per test: 0.5 sec. memory limit per test: 4096 KB 有两个盒子. 第一个盒子里有A 个球, 第二个里面有B 个球 (0 < A + B < 2147483648). 允许把球在两个盒子间移动. 从一个盒子向另一个盒子移动球的数目必须等 于接受盒子现有的球的数量. 你需要搞清楚, 最后球能不能都移动到一个盒子里 Input 第一行两个整数 A 和 B, 空格分隔. Outpu…
点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数为结尾所能得到的合法子序列的最长长度. 则一个数能从另一个数那里转移,当且仅当这两个数按位与的值不为\(0\). 考虑按位与的值不为\(0\),实际意义就是二进制下存在至少一位上这两个数都是\(1\). 那么,我们可以枚举两个位置,然后枚举二进制下一位判断是否可以转移. 这样就可以轻松得出一个复杂度比暴力还…
再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define lc(x) ch[x][0] #define rc(x) ch[x][1] #define inf 0x3f3f3f3f #define N 200005 using namespace std; ]; int k[N];int cnt,root; int size[N],…
水题...貌似理解splay怎么维护数列了... 每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 100005 #define lc(x) ch[x][0] #define rc(x) ch[x][1] using n…
Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1325  Solved: 722 Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个整数,第i个整数表示ai. Output 输出文件共一行. 包括一个整数,表示子序列bi的最长长度. Sample Input 3 1 2 3 Sample O…
分析:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题看起来没办法做……但是注意到1e12只要开方8次就能到1……所以直接暴力就行了………