日常训练 20170605 EasyProblem
来源:互联网 发布:淘宝工作人员的名片 编辑:程序博客网 时间:2024/05/20 01:46
给你
有三种询问:
对于
#include<bits/stdc++.h>const int A = 1 << 16;template <typename T> void read(T &x) { x = 0; char c = getchar(); for (; !isdigit(c); c = getchar()); for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';}int n, q, x, sum[A];bool exs[A], up[A];char op[5];int calc(int l, int r) { if (!l) return sum[r]; return sum[r] - sum[l - 1];}int Xor(int x) { int l = 0, r = A - 1, ans = 0; for (int i=A>>1; l < r; i >>= 1) { int mid = (l + r) >> 1; if (x & i) { if (calc(l, mid)) r = mid, ans += i; else l = mid + 1; }else { if (calc(mid + 1, r)) l = mid + 1, ans += i; else r = mid; } } return ans;}int And(int x) { for (int i=x; i>=0; i = (i - 1) & x) if (up[i]) return i;}int Or(int x) { int y = (A - 1) ^ x; for (int i=y; i>=0; i = (i - 1) & y) if (up[i]) return i | x;}int main() { read(n); read(q); while (n--) read(x), exs[x] = 1, sum[x] = 1; for (int i=1; i < A; i++) sum[i] += sum[i - 1]; for (int i=0; i < A; i++) if (exs[i]) for (int j=i; j>=0; j = (j - 1) & i) { up[j] = 1; if (!j) break; } while (q--) { scanf("%s", op);read(x); if (op[0] == 'X') printf("%d\n", Xor(x)); if (op[0] == 'A') printf("%d\n", And(x)); if (op[0] == 'O') printf("%d\n", Or(x)); } return 0;}
阅读全文
0 0
- 日常训练 20170605 EasyProblem
- 日常训练 20170605 MediumProblem
- 日常训练 20170605 费用流
- HEU日常训练10.02
- 日常训练小结
- 日常训练20161012 道路网
- 日常训练20161012 醉酒
- 日常训练20161014 跟踪
- 日常训练20161018 证据
- 日常训练20161018 subset
- 日常训练 平均数
- 日常训练 水箱
- 日常训练 棋盘游走
- 日常训练 20170531 数字
- 日常训练 20170531 探险
- 日常训练 20170531 矩阵
- 日常训练 20170602 Book
- 日常训练 20170602 Equation
- iOS App作为外设(从设备)设置广播间隙和连接间隙最大值最小值问题
- 学习 shell —— 创建序列数组
- python2.7 模拟鼠标 实现网页打地鼠
- 自学20天java的感受
- linux下通过yum安装svn及配置
- 日常训练 20170605 EasyProblem
- 单应矩阵分解
- angular 回车事件(回车发送,回车加ctrl 换行)
- 不同服务器的配置信息和jdbc代码封装
- 关于soap命名空间的问题(转)
- Linux(UBuntu16.04)下编译mysql 5.1.73时报错: error: No curses/termcap library found
- ios window上添加悬浮button 记录
- 【JavaScript DOM编程艺术】- 动态创建标记
- Qt实现桌面截屏