zoukankan      html  css  js  c++  java
  • BZOJ2741: 【FOTILE模拟赛】L

    题解:  对于区间分块 预处理出ans[i][j]表示第i块到第j块内的答案 对于不在块两边的零碎部分 直接暴力算即可

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <set>
    #include <map>
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define inc(i,l,r) for(int i=l;i<=r;i++)
    #define dec(i,r,l) for(int i=r;i>=l;i--)
    const int MAXN=2e4+10;
    const double eps=1e-8;
    #define ll long long
    using namespace std;
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    typedef struct node{
        int c[2],sum;
    }node;
    node d[41*MAXN];
    int rt[MAXN],cnt,n,m,sz,p[MAXN];
    ll a[MAXN],sum[MAXN],ans[201][201];
    void insert(int x,ll k){
        bool flag;
        dec(i,40,0){
            flag=k&(1LL<<i);
            int t=++cnt;d[t]=d[d[x].c[flag]];d[t].sum++;d[x].c[flag]=t;x=t;
        }
    }
    ll querty(int x,int y,ll k){
        if(x>=y)return 0;
        bool flag;
        ll res=0;
        dec(i,40,0){
            flag=k&(1LL<<i);
            if(flag){
                if(d[d[y].c[0]].sum-d[d[x].c[0]].sum)y=d[y].c[0],x=d[x].c[0];
                else x=d[x].c[1],y=d[y].c[1],res+=(1LL<<i);
            }
            else{
                if(d[d[y].c[1]].sum-d[d[x].c[1]].sum)x=d[x].c[1],y=d[y].c[1],res+=(1LL<<i);
                else x=d[x].c[0],y=d[y].c[0];
            }
        }
        return (res^k);
        //return (id[y]^k);
    }
    ll solve(int x,int y){
        //cout<<x<<" "<<y<<" "<<p[x]<<" "<<p[y]<<endl;
        if(p[y]-p[x]<=1){
            ll ans1=a[x];
            inc(i,x+1,y){
                //cout<<sum[i]<<"===="<<endl;
                ans1=max(max(ans1,querty(rt[x-2],rt[i-1],sum[i])),sum[i]^sum[i-1]);
            }
            return ans1;
        }
        ll ans2=ans[p[x]+1][p[y]-1];
        //cout<<ans2<<endl;
        inc(i,x,p[x]*sz)ans2=max(max(ans2,querty(rt[i],rt[y],sum[i-1])),sum[i]^sum[i-1]);
        //cout<<ans2<<endl;
        inc(i,(p[y]-1)*sz+1,y)ans2=max(max(ans2,querty(rt[x-2],rt[i-1],sum[i])),sum[i]^sum[i-1]);
       // cout<<ans2<<endl;
        return ans2;
    }
    int main(){
        n=read();m=read();sz=sqrt(n);
        inc(i,1,n)a[i]=read(),sum[i]=a[i]^sum[i-1];
        rt[0]=++cnt;insert(rt[0],0);
        inc(i,1,n){rt[i]=++cnt;d[rt[i]]=d[rt[i-1]];insert(rt[i],sum[i]);}
        inc(i,1,n)p[i]=(i-1)/sz+1;
       // cout<<sz<<endl;
        inc(i,1,p[n]){
            int t=(i-1)*sz+1;
            ll ans2=a[t];
            inc(k,(i-1)*sz+2,min(n,i*sz))ans2=max(max(ans2,querty(rt[t-2],rt[k-1],sum[k])),sum[k]^sum[k-1]);
            ans[i][i]=ans2;
            inc(j,i+1,p[n]){
                ll ans1=a[t];
                inc(k,(j-1)*sz+1,min(n,j*sz))ans1=max(max(ans1,querty(rt[t-2],rt[k-1],sum[k])),sum[k]^sum[k-1]);
                ans[i][j]=max(ans[i][j-1],ans1);
                //cout<<i<<" "<<j<<" "<<ans[i][j]<<endl;
            }
        }
        ll res=0;int l,r,x,y;
        while(m--){
            x=read();y=read();
            l=min((x+res)%n+1,(y+res)%n+1);r=max((x+res)%n+1,(y+res)%n+1);
            res=solve(l,r);
            printf("%lld
    ",res);
        }
        return 0;
    }
    

    2741: 【FOTILE模拟赛】L

    Time Limit: 15 Sec  Memory Limit: 162 MB
    Submit: 3971  Solved: 1099
    [Submit][Status][Discuss]

    Description

    FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和。
    即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r。
    为了体现在线操作,对于一个询问(x,y):
    l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
    r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
    其中lastans是上次询问的答案,一开始为0。

    Input

    第一行两个整数N和M。
    第二行有N个正整数,其中第i个数为Ai,有多余空格。
    后M行每行两个数x,y表示一对询问。
     
     

    Output

     

    共M行,第i行一个正整数表示第i个询问的结果。

    Sample Input

    3 3
    1 4 3
    0 1
    0 1
    4 3


    Sample Output

    5
    7
    7

     

  • 相关阅读:
    一个好用的,个人记事本应用,软件joplin
    aws EKS EFS 上安装mysql Operation notpermitted
    多变量的线性回归
    批量梯度下降BGD、随机梯度下降SGD和小批量梯度下降MBGD对比
    单变量线性回归
    数据库限制内存使用方法
    C# 调用 Excel 宏的方法
    Markdown 使用方法总结
    VBA注意事项
    将CSV文件中的数据导入到SQL Server 数据库中
  • 原文地址:https://www.cnblogs.com/wang9897/p/9738863.html
Copyright © 2011-2022 走看看