zoukankan      html  css  js  c++  java
  • Wannafly挑战赛17D 01序列2

    传送门

    先考虑二进制下为3倍数的数的共同特点自己手玩去,可以发现这些数奇数二进制位上的1个数(记为(a))和偶数二进制位上的1个数(记为(b))在模3意义下相等((a equiv b (mod 3))),所以可以维护所有前缀中,(a)为0/1/2以及(b)为0/1/2的前缀个数,用线段树维护每个区间的这些值.但是合并的时候,我们还需要知道前一个区间的最后一个前缀的(a,b)状态,所以把这个也维护起来.每次就单点修改,询问就把某个区间的所有状态的前缀个数抠出来,然后分类讨论一下(逃

    代码里记录状态是(a-b)在模3意义下为0/1/2的前缀个数,以及最后一个前缀的0/1/2状态,这样比较方便(雾)

    (因为实在不知道怎么写,就看代码吧

    #include<bits/stdc++.h>
    #define LL long long
    #define il inline
    #define re register
    #define db double
    #define eps (1e-5)
     
    using namespace std;
    const int N=500000+10;
    il LL rd()
    {
      LL x=0,w=1;char ch=0;
      while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
      while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
      return x*w;
    }
    #define lc (o<<1)
    #define rc ((o<<1)|1)
    #define mid ((l+r)>>1)
    struct node
    {
      int wb[3],las;
      node(){wb[0]=wb[1]=wb[2]=las=0;}
    }s[N<<2],nw;
    il node ad(node a,node b)
    {
      node an;
      an.las=(a.las+b.las)%3;
      for(int i=0;i<3;i++) an.wb[i]=a.wb[i]+b.wb[(i-a.las+3)%3];
      return an;
    }
    void bui(int o,int l,int r)
    {
      if(l==r)
        {
          if(rd()&1) s[o].wb[2-(l&1)]=1,s[o].las=2-(l&1);
          else s[o].wb[0]=1;
          return;
        }
      bui(lc,l,mid),bui(rc,mid+1,r);
      s[o]=ad(s[lc],s[rc]);
    }
    void modif(int o,int l,int r,int lx)
    {
      if(l==r)
        {
          if(s[o].las) s[o].wb[2-(l&1)]=s[o].las=0,s[o].wb[0]=1;
          else s[o].wb[2-(l&1)]=1,s[o].las=2-(l&1),s[o].wb[0]=0;
          return;
        }
      if(lx<=mid) modif(lc,l,mid,lx);
      else modif(rc,mid+1,r,lx);
      s[o]=ad(s[lc],s[rc]);
    }
    node quer(int o,int l,int r,int ll,int rr)
    {
      if(ll<=l&&r<=rr) return s[o];
      node a,b;
      if(ll<=mid) a=quer(lc,l,mid,ll,rr);
      if(rr>mid) b=quer(rc,mid+1,r,ll,rr);
      return ad(a,b);
    }
    int n,m;
    LL ans;
                                      
    int main()
    {
      n=rd(),m=rd();
      bui(1,1,n);
      while(m--)
        {
          int op=rd();
          if(op&1) modif(1,1,n,rd());
          else
            {
              ans=0;
              int l=rd(),r=rd();
              nw=quer(1,1,n,l,r);++nw.wb[0];
              ans=1ll*nw.wb[0]*(nw.wb[0]-1)/2+1ll*nw.wb[1]*(nw.wb[1]-1)/2+1ll*nw.wb[2]*(nw.wb[2]-1)/2;
              printf("%lld
    ",ans);
            }
        }
      return 0;
    }
    
  • 相关阅读:
    webpack入门(1)
    react基础(2)
    react基础(1)
    react入门(5)
    react入门(4)
    react入门(3)
    webstorm出现黑色块光标
    微信小程序——组件(二)
    微信小程序——组件(一)
    react-native 在Xcode上传到iTunes Connect里报错
  • 原文地址:https://www.cnblogs.com/smyjr/p/9892942.html
Copyright © 2011-2022 走看看