正题
题目大意
序列aaa
求有多少个数(x,y)(x,y)(x,y)对满足:
x<yx<yx<y和axorax+1orax+2...oray<ma_x\ or\ a_{x+1}\ or\ a_{x+2}...or\ a_y<max or ax+1 or ax+2...or ay<m
解题思路
首先对于每个y,x满足单调性。
如果(x,y)(x,y)(x,y)可以那么(x+1,y)(x+1,y)(x+1,y)也可以,所以我们可以枚举yyy,然后维护xxx指针,如果不满足条件就将xxx移动到满足条件为止。
时间复杂度O(nlog2m)O(n\ \ log^2\ m)O(n log2 m)
codecodecode
#include<cstdio>
#define N 100010
#define W 32
#define ll long long
using namespace std;
ll n,m,a[N],v[W],last,ans;
int main()
{freopen("evolve.in","r",stdin);freopen("evolve.out","w",stdout);scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);last=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&&last<i)//移动x{z=0;for(ll j=0;j<=30;j++)//去掉 v[j]-=(a[last]>>j)&1,z+=(v[j]!=0)<<j;last++;}ans+=i-last;//if(i!=last)//printf("%lld-%lld\n",last,i);}printf("%lld",ans);
}