hdu4737 A Bit Fun】的更多相关文章

囧== 下面的做法是错误的.下午在路上突然明白了== 哎,到现在还是只知道暴力的做法,囧爆了:http://www.cnblogs.com/liuxueyang/p/3322197.html 类似于前序和的那种思想. b数组代表前序或,c数组代表后序或. O(N)预处理出数组b和数组c 在从前往后扫一遍O(N)的复杂度,求出ans 如图: 可以发现c[Head] & b[Tail] 就可以求出任意区间内的f(Head, Tail),可以知道,整个数组里面每个元素进入区间一次,出去一次,所以是O(…
link:http://acm.hdu.edu.cn/showproblem.php?pid=4737 暴力可以过啊.O(N^2)的复杂度. #include <cstdio> ]; int main(void) { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int t; scanf("%d", &t); long long int ans; ; i…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4737 题意:给一个数列a0, a1 ... , an-1,令 f(i, j) = ai|ai+1|ai+2| ... | aj,求数列中有多少对f(i,j)满足f(i,j)<m. 转化为二进制数,依次枚举j,那么只要找到第一个满足的 i 就可以了,我们用个数组w[k]标记每位二进制中的1在j左边第一次出现的位置,然后依次根据w[k]数组中的位置从大到小加数,直到大于m为止,就是此时j对应的最小的i.…
题目大意 给你一个数组a,定义f(i,j)=ai|ai+1|ai+2|⋯|aj ,|为or运算,求满足f(i,j)<m的二元组个数,N≤105,m≤230 题解 枚举起点i,然后找出最靠右的k,使得f[i,k)<m,计算f(i,k)的值可以用线段树来维护,查询只需要logn时间,求k这个位置可以用二分法求出,总的时间复杂度为nlogn^2,刚好能够趟过...话说有很多人是用O(n^2)暴力每一对f(i,j),然后加上剪枝,速度奇快.... 代码: #include<iostream>…