zoukankan      html  css  js  c++  java
  • bzoj4184

    题解:

    按时间分治线段树

    然后线性基维护一下就好了

    尝试了一下循环展开并没有什么效果

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=5e5+10;
    const int mo=N*6;
    int n,m,ph[N*4],pt[N*4],f[N*7],g[N*7],ans2[N];
    int dy[50][35];
    vector<int> ve[N*4];
    #define rint register int
    #define IL inline
    char ss[1<<20],*A=ss,*B=ss;
    IL char gc(){return A==B&&(B=(A=ss)+fread(ss,1,1<<20,stdin),A==B)?EOF:*A++;}
    template<class T> void read(T&x){
      rint f=1,c;
      while (c=gc(),c<48||57<c) 
        if (c=='-') f=-1;
      x=c^48;
      while (c=gc(),47<c&&c<58) x=(x<<3)+(x<<1)+(c^48);
      x*=f;
    }
    IL void insert(int x,int y)
    {
      int xx=x%mo;
      while (f[xx]) xx++;
      f[xx]=x; g[xx]=y;
    }
    IL int find(int x)
    {
      int xx=x%mo;
      while (f[xx]!=x) xx++;
      return(xx);
    }
    #define mid ((ph[x]+pt[x])/2)
    void build(int x,int h,int t)
    {
      ph[x]=h; pt[x]=t;
      if (h==t) return;
      build(x*2,h,mid); build(x*2+1,mid+1,t);
    }
    void insert2(int x,int h,int t,int k)
    {
      if (h<=ph[x]&&pt[x]<=t)
      {
        ve[x].push_back(k);
        return;
      }
      if (h<=mid) insert2(x*2,h,t,k);
      if (mid<t) insert2(x*2+1,h,t,k);
    }
    void dfs(int x,int cnt)
    {
      for (rint i=0;i<=30;i++) dy[cnt][i]=dy[cnt-1][i];
      rint len=ve[x].size();
      for (rint i=0;i<=len/4;i++)
      {
        
        if (i*4>=len) break;
        rint y1=ve[x][i*4],y2=ve[x][i*4+1],
             y3=ve[x][i*4+2],y4=ve[x][i*4+3];
        for (rint i1=30;i1>=0;i1--)
          if (y1&(1<<i1))
            if (!dy[cnt][i1])
            {
              dy[cnt][i1]=y1; break;
            } else y1^=dy[cnt][i1];
      
      
        if (i*4+1>=len) break;      
        for (rint i2=30;i2>=0;i2--)
          if (y2&(1<<i2))
            if (!dy[cnt][i2])
            {
              dy[cnt][i2]=y2; break;
            } else y2^=dy[cnt][i2];
      
      
        if (i*4+2>=len) break;
        for (rint i3=30;i3>=0;i3--)
          if (y3&(1<<i3))
            if (!dy[cnt][i3])
            {
              dy[cnt][i3]=y3; break;
            } else y3^=dy[cnt][i3];
      
      
        if (i*4+3>=len) break;    
        for (rint i4=30;i4>=0;i4--)
          if (y4&(1<<i4))
            if (!dy[cnt][i4])
            {
              dy[cnt][i4]=y4; break;
            } else y4^=dy[cnt][i4];
      }
      if (ph[x]==pt[x])
      {
        rint ans=0;
        for (rint i=30;i>=0;i--)
          if (dy[cnt][i]&&!(ans&(1<<i))) ans^=dy[cnt][i];
        ans2[ph[x]]=ans;
        return;
      }
      dfs(x*2,cnt+1); 
      dfs(x*2+1,cnt+1);
    }
    int main()
    {
      freopen("4184.in","r",stdin);
      freopen("4184.out","w",stdout);
      read(n);
      build(1,1,n);
      for (int i=1;i<=n;i++)
      {
        int x;
        read(x);
        if (x<0)
        {
          int y=find(-x);
          insert2(1,g[y],i-1,-x);
          f[y]=0; g[y]=0;
        } else
        {
          insert(x,i);
        }
      }
      for (rint i=1;i<=N*7-10;i++)
        if (f[i])
        {
          insert2(1,g[i],n,f[i]);
        }
      dfs(1,1);
      for (int i=1;i<=n;i++)
        printf("%d
    ",ans2[i]);
      return 0;
    }
  • 相关阅读:
    redis client 2.0.0 pipeline 的list的rpop bug
    Python解释器镜像源修改
    全连接层
    测试(张量)- 实战
    数据加载
    Python之微信-微信好友头像合成
    高阶操作
    MYSQL 查询缓存
    SQL Server 查看指定表上的索引
    MYSQL 查看表上索引的 1 方法
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/9048428.html
Copyright © 2011-2022 走看看