HDU4737线段树
来源:互联网 发布:戴尔显卡切换软件 编辑:程序博客网 时间:2024/05/17 00:41
题目大意:给定一系列数,F(i,j)表示对从ai到aj连续求或运算,(i<=j)求F(i,j)<=m的总数。
const int Max_N = 100008 ;int sum[Max_N<<2] , x[Max_N] ;int n , m ;void push_up(int t){ sum[t] = sum[t<<1] | sum[t<<1|1] ;}void update(int i , int a , int L , int R , int t){ if(L == R){ sum[t] |= a ; return ; } int M = (L + R) >> 1 ; if(i <= M) update(i , a , L , M , t<<1) ; else update(i , a , M+1 , R , t<<1|1) ; push_up(t) ;}int query(int now , int L , int R , int t){ if((now|sum[t]) < m) return R ; if(L == R) return -1 ; int M = (L + R) >> 1 ; if((now|sum[t<<1]) >= m) return query(now , L , M , t<<1) ; else return max(M , query(now|sum[t<<1] , M+1 ,R , t<<1|1)) ;}int main(){ int i , t , T = 1 , r , ans ; cin>>t ; while(t--){ scanf("%d%d" ,&n , &m) ; for(i = 1 ; i <= n ; i++) scanf("%d" ,&x[i]) ; memset(sum , 0 , sizeof(sum)) ; ans = 0 ; for(i = n ; i >= 1 ; i--){ update(i , x[i] , 1 , n , 1) ; r = query(0 , 1 , n , 1) ; if(r != -1) ans += r - i + 1 ; } printf("Case #%d: %d\n" , T++ , ans) ; } return 0 ;}
0 0
- HDU4737线段树
- HDU4737(暴力)
- hdu4737(或运算)
- hdu4737区间统计
- HDU4737【尺取】
- HDU4737--A Bit Fun HDU(149)
- HDU4737 A Bit Fun 位运算
- HDU4737:A Bit Fun(二分)
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- android模拟器鼠标滑动 经常出现搜索框 C现象
- iPhone中删除app时icon晃动的动画
- UITableView隐藏多余的分割线
- android横竖屏切换与activity的销毁重建
- 命令行查看android数据库
- HDU4737线段树
- 学习笔记_java web—EL表达式
- .net 获取根目录的方法集合
- 开始学数据结构——(一):选择排序
- ACR10E
- XHTML
- 什么是数字PLL
- c#学习笔记杂项(一)
- 把UIView切成任意形状