题目大意:
已知序列A0,A1……An-1,从Ax进化到Ay的复杂度是Ax | Ax+1 | Ax+2 …… | Ay,问有多少对进化(Ax进化为Ay是一对)满足复杂度<=m
解题思路:
我们知道 x | y >= x且 x | y >= y
所以Ax | Ax+1 | …… | Ay <= Ax+1 | Ax+2 | …… | Ay
也就是说当Ax进化为Ay的复杂度是可以接受的,Ax+1进化为Ay的复杂度也是可以接受的
Accepted code:
#include<cstdio>
#include<cctype>
#define N 100010
#define W 32
#define ll long long
using namespace std;
void read(long long &x) {
x = 0; char c = getchar();
while (!isdigit(c)) c =getchar();
while (isdigit(c)) x = (x<<1) + (x<<3) + c - 48, c = getchar();
return;
}
ll n, m, a[N], v[W], ls, ans;
int main() {
freopen("evolve.in","r",stdin);
freopen("evolve.out","w",stdout);
read(n); read(m);
for(ll i = 1; i <= n; i++)
read(a[i]);
ls = 1;
for(ll i = 1; i <= n; i++) {
ll z = 0;
for(ll j = 0; j <= 30; j++)
v[j] += (a[i]>>j) & 1,
z += (v[j]!=0) << j;
while(z >= m && ls < i) {
z=0;
for(ll j = 0; j <= 30; j++)
v[j] -= (a[ls]>>j) & 1,
z += (v[j]!=0) << j;
ls++;
}
ans += i - ls;
}
printf("%lld",ans);
}