jzoj3518-进化序列(evolve)【位运算】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3518-进化序列(evolve)【位运算】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
序列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); }總結
以上是生活随笔為你收集整理的jzoj3518-进化序列(evolve)【位运算】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恩格尔系数在多少为小康水平 恩格尔系数多
- 下一篇: 我心灿烂分集剧情介绍 我心灿烂剧情介绍