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;
}① 处应填( )。
选项(单选)
答案解析
详细答案解析为会员权益,按每日次数查看。
开通 / 升级会员
上一题
下一题