题解:P5670 秘籍-反复异或

· · 题解

前情提要。

题意

有一个长度为 n 的正整数,我们需要进行 q 次操作,每次查询一个区间的异或和并对 2^m 取模,或者将一个区间的所有数加上一个数。

思路

本题是一道纯粹的模拟题,考察对题目的模拟能力,对于每个操作,我们只需要按题意模拟即可。

值得注意的是,无符号类型整数做大量位运算时比有符号类型整数快得多。

#include<bits/stdc++.h>
#define short unsigned short
using namespace std;
const int N=1e5+5;
short a[N],op[N];
short ans[N];
int x[N],y[N],c[N],len;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m,q;
    cin>>n>>m>>q;
    short k=(1<<m)-1;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=q;i++){
        cin>>op[i]>>x[i]>>y[i];
        if(op[i]==1) cin>>c[i];
    }
    short xx=0;
    for(int l=1;l<=q;l++){
        if(op[l]==1)
            for(int i=x[l];i<=y[l];i++) a[i]=a[i]+c[l]&k;
        else{ 
            for(int i=x[l];i<=y[l];i++) xx^=a[i];
            ans[++len]=xx,xx=0;
        }
    }
    for(int i=1;i<=len;i++) cout<<ans[i]<<'\n';
    return 0;
}