测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A23501. 位运算操作现有编号为 1 到 n 的 n 位同学和 n 个操作,每位同学都会进行一些操作,操作流程如下面描述。最开始老师手里有一个整数 x,交给 1 号同学,1 号同学执行完第 1 个操作交给 2 号同学;2 号同学执行完第 1,2 个操作交给 3 号同学;……;第 i 号同学从第 i-1 号同学接过数后,依次执行前 i 个操作,将最后的数交给第 i+1 号同学;依此下去直到第 n 号同学完成所…

单选题 较易

题目描述

位运算操作

现有编号为 1 到 n 的 n 位同学和 n 个操作,每位同学都会进行一些操作,操作流程如下面描述。

最开始老师手里有一个整数 x,交给 1 号同学,1 号同学执行完第 1 个操作交给 2 号同学;2 号同学执行完第 1,2 个操作交给 3 号同学;……;第 i 号同学从第 i-1 号同学接过数后,依次执行前 i 个操作,将最后的数交给第 i+1 号同学;依此下去直到第 n 号同学完成所有操作。

为了方便表示,我们用二元组来描述操作,其中第 i 个操作用二元组 (op, a[i]) 表示:op 取值为 1,2,3 分别表示当前数字与 a[i] 进行 AND, OR, XOR 操作(即按位与,按位或,按位异或)。

求每个同学执行完自己的轮次后,手里的数是多少。

先输入 n 和初始的整数 x,接下来 n 行每行两个数表示描述操作的三元组。

数据范围满足 (1 ≤ \leq≤ n ≤ \leq≤ 2 * 1 0 5 10^5 105 , 0 ≤ \leq≤ a[1], x ≤ \leq≤ 10 9 ^9 9 )。

提示:如果进行模拟时间复杂度为 (O(n 2 ^2 2 )) 会超时,因此采用位运算,提前通过递推求出 x 的每一个数位经过前 i 次操作后的值。设 f[i][j][k] 表示初始状态是 j,经过 k 次操作第 i 位的值。实际模拟时直接读取该值即可。

试补全程序。

#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
int op[M],a[M];
int n,x;
int f[35][2][M];
int main() {
    cin>>n>>x;
    for(int i=1;i<=n;i++) cin>>op[i]>>a[i];
    for(int i=0;i<30;i++) {
        __①__;
    }
    for(int i=0; i<30;i++) {
        for(int j=0;j<2;j++) {
            for(int k=1; k<=n;k++) {
                int bit=__②__;
                if(op[k]==1) f[i][j][k]=f[i][j][k-1] & bit;
                if(op[k]==2) f[i][j][k]=f[i][j][k-1] | bit;
                if(op[k]==3) f[i][j][k]=__③__;
            }
        }
    }
    for(int i = 1; i <= n; ++i) {
        int t=0;
        for(int j=0;j<30;j++) {
            int bit=(x>>j)&1;
            __④__;
            if(__④__) t+=(__⑤__);
        }
        cout<<t<<endl;
        x=t;
    }
    return 0;
}

① 处应填(    )。

选项(单选)

上一题 下一题