2019杭电多校第一场B-operation

本文提供了一道来自Codeforces平台的题目CF1110F的解答思路及代码实现,通过一种数据结构来高效处理数组更新与区间查询问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接


原题CF1110F,详见

感谢 爱吃饼的猴子 指出的错误,现已改正


#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;

template<class T> void _deb(const char *name,T val){
    cout<<name<<val<<endl;
}
const int maxn=1e6+5;

int N,M;
int LB[maxn][32],pos[maxn][32];
inline void copy(int k);
void insert(int x,int k);
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int cnt=0,temp;
        scanf("%d%d",&N,&M);
        rep(i,1,N+1){
            scanf("%d",&temp);
            cnt++;
            copy(cnt);
            insert(temp,cnt);
        }

        int lastans=0;
        rep(i,0,M){
            int op;
            scanf("%d",&op);
            switch(op){
                case 0:
                {   int l,r;
                    scanf("%d%d",&l,&r);
                    //decode
                    l=(l^lastans)%cnt+1;
                    r=(r^lastans)%cnt+1;
                    if(l>r)
                        swap(l,r);

                    int ans=0;
                    drep(i,30,0){
                        if(l<=pos[r][i]){
                            ans=max(ans,ans^LB[r][i]);
                        }
                    }

                    lastans=ans;
                    printf("%d\n",ans);
                    break;
                }
                case 1:
                    scanf("%d",&temp);
                    cnt++;
                    copy(cnt);
                    insert(temp^lastans,cnt);
                    break;
            }
        }

    }

    re 0;
}
inline void copy(int k){
    rep(i,0,31){
        LB[k][i]=LB[k-1][i];
        pos[k][i]=pos[k-1][i];
    }
}
void insert(int x,int k){
    int r=k;
    drep(i,30,0){
        if(x&(1<<i)){
            if(!LB[r][i]){
                LB[r][i]=x;
                pos[r][i]=k;
                return;
            }

            if(pos[r][i]<k){
                swap(LB[r][i],x);
                swap(pos[r][i],k);
            }

            x^=LB[r][i];
        }
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值