NC213756. 二进制
描述
输入描述
第一行一个整数 n,表示计算器的操作次数
接下来 n 行,每行两个整数 op 与 a ,按顺序描述了每次操作
输出描述
第一行一个 m,表示你的操作次数
你必须保证你输出的
接下来 m 行每行仿照输入中 的格式输出每次操作
示例1
输入:
1 1 14514
输出:
1 1 14514
C++(g++ 7.5.0) 解法, 执行用时: 185ms, 内存消耗: 4748K, 提交时间: 2022-08-11 15:51:47
#include <iostream> #include <algorithm> using namespace std; using ll = long long; int a = 0, b = (1 << 20) - 1; int main() { int n; cin >> n; while (n--) { int op, x; cin >> op >> x; if (op == 1) a &= x, b &= x; if (op == 2) a |= x, b |= x; if (op == 3) a ^= x, b ^= x; } int x = (1 << 20) - 1, y = 0, z = 0; for (int i = 0; i < 20; i++) { int c = a >> i, d = b >> i; if (c & 1 && d & 1) y |= 1 << i; else if (c & 1) z |= 1 << i; else if ((c & 1) == 0 && (d & 1) == 0) x ^= 1 << i; } printf("3\n1 %d\n2 %d\n3 %d", x, y, z); return 0; }
C(clang11) 解法, 执行用时: 74ms, 内存消耗: 368K, 提交时间: 2021-02-24 17:02:00
#include <stdio.h> int main() { int n,p;int x1=1048575,x2=0,a,i,k=1; int A=x1,O=0,X=0; scanf("%d",&n); while(n--) { scanf("%d %d",&p,&a); if(p==1) {x1=x1&a;x2=x2&a;} else if(p==2) {x1=x1|a;x2=x2|a;} else if(p==3) {x1=x1^a;x2=x2^a;} } for(i=0;i<20;i++) { if(x1%2&&x2%2) O+=k; else if(x1%2+x2%2==0) A-=k; else if(x1%2==0&&x2%2) X+=k; k=k*2;x1=x1/2;x2=x2/2; } printf("3\n1 %d\n2 %d\n3 %d",A,O,X); }
C++(clang++11) 解法, 执行用时: 205ms, 内存消耗: 4728K, 提交时间: 2021-01-27 19:33:55
#include <iostream> using namespace std; int a=0,b=1048575; int And=b,Or=0,Xor=0; int main(int argc, char** argv) { int n; cin >> n; while(n--) { int op,x; cin >> op >> x; if(op==1) a&=x,b&=x; if(op==2) a|=x,b|=x; if(op==3) a^=x,b^=x; } for(int j=0;j<20;j++) { if(a&(1<<j)) { if(b&(1<<j)) Or|=(1<<j); else Xor^=(1<<j); } else if(!(b&(1<<j))) And^=(1<<j); } cout << 3 << "\n" << 1 << " " <<And << "\n" << 2 << " " << Or << "\n3 " << Xor; return 0; }