二分。先水过,又用二分正解过了遍
#include <cstdio>//二分
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define N 100005
#define INF 1000000007
int n, m, t;
int a[N];
int sum[N][32];
int main(){
scanf("%d", &t);
int num = 1;
while(t--){
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(int i = 0; i < n; i++){
for(int j = 0; j <= 30; j++)
sum[i][j] = 0;
int x = a[i];
for(int j = 0; x != 0; j++){
sum[i][j] += x & 1;
x >>= 1;
}
if(i > 0)
for(int j = 0; j <= 30; j++)
sum[i][j] += sum[i - 1][j];
}
int tot = 0;
int r[30];
for(int i = 0; i < n; i++){
int l = i, r = n - 1, mid;
int rm = i - 1;
while(l <= r){
mid = (l + r) >> 1;
int ans = 0;
for(int j = 0; j <= 30; j++){
if(i > 0){
if(sum[mid][j] - sum[i - 1][j])ans |= (1 << j);
}
else if(sum[mid][j])ans |= (1 << j);
}
if(ans < m){
l = mid + 1;
if(rm < mid)rm = mid;
}
else r = mid - 1;
}
tot += rm - i + 1;
}
printf("Case #%d: ", num++);
printf("%d\n", tot);
}
return 0;
}
#include <cstdio>//乱搞
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define N 100005
#define INF 1000000007
int n, m, t;
int a[N];
int main(){
scanf("%d", &t);
int num = 1;
while(t--){
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
LL sum = 0;
int flag = INF;
for(int i = 0; i < n; i++){
int ans = 0;
int j;
for(j = i; j < n; j++){
ans |= a[j];
if(ans < m)sum++;
else break;
}
if(ans < m){
flag = i + 1;
break;
}
}
for(int i = flag; i < n; i++){
sum += (1LL * n - i);
}
printf("Case #%d: ", num++);
printf("%I64d\n", sum);
}
return 0;
}