题意:定义f(i, j) = ai|ai+1|ai+2| ... | aj (| 指或运算),求有多少对f(i,j)<m。1 <= n <= 100000, 1 <= m <= 230
分析:直接暴力。先固定左端点i,枚举j,当f(i,j)>=m时剪枝就行了,理论上O(n^2)的复杂度是过不了的,但是数据水了,加了那个剪枝后速度奇快。。。。
网上有O(30*n)的算法,但是我看了好久都没能理解=_=
AC代码:
1 #include<stdio.h> 2 int a[100005],b[100005]; 3 int main() 4 { 5 int j,n,m,i,t,k; 6 scanf("%d",&t); 7 for(i=1;i<=t;i++) 8 { 9 scanf("%d%d",&n,&m); 10 __int64 ans=0; 11 for(j=1;j<=n;j++) 12 { 13 scanf("%d",&a[j]); 14 b[j]=a[j]; 15 if(b[j]<m) 16 ans++; 17 } 18 for(j=1;j<=n;j++) 19 { 20 for(k=j+1;k<=n;k++) 21 { 22 b[j]|=a[k]; 23 if(b[j]<m) 24 ans++; 25 else 26 break; 27 } 28 } 29 printf("Case #%d: %I64d\n",i,ans); 30 } 31 return 0; 32 }