http://codeforces.com/problemset/problem/165/E

题意

两个整数 x 和 y 是 兼容的,如果它们的位运算 "AND" 结果等于 0,亦即 a & b = 0 。例如,数 90 (10110102) 和 36 (1001002) 是兼容的,因为 10110102 & 1001002 = 02;而数 3 (112)和 6 (1102) 是不兼容的,因为 112 & 1102 = 102 。

给定一个整数数组 a1, a2, ..., an 。您的任务是判断每个数组元素:这个元素是否与给定数组中的某个其它元素兼容?如果问题的答案是肯定的,则应找出任意一个匹配的元素。

第一眼觉得用01字典树可做,但当所有值都是1的时候,每次遍历就要遍历整个字典树,很显然会T。只能考虑其他做法。

我们发现给的数据范围是400w,是可以直接用数组开下的,考虑到&运算的时候只有原数字位位1和另一个数字相同位为1的时候才会导致不匹配。

所以我们利用贪心的思想,先把能与这个数匹配的最大数直接存入数组,之后从后往前遍历,如果遇到没有匹配的数字,就考虑比他多一位1的数字有没有匹配,因为在相同位上1总为0的子集,因此这样预处理之后可直接输出,

  1. #include <map>
  2. #include <set>
  3. #include <ctime>
  4. #include <cmath>
  5. #include <queue>
  6. #include <stack>
  7. #include <vector>
  8. #include <string>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cstring>
  12. #include <sstream>
  13. #include <iostream>
  14. #include <algorithm>
  15. #include <functional>
  16. using namespace std;
  17. #define For(i, x, y) for(int i=x;i<=y;i++)
  18. #define _For(i, x, y) for(int i=x;i>=y;i--)
  19. #define Mem(f, x) memset(f,x,sizeof(f))
  20. #define Sca(x) scanf("%d", &x)
  21. #define Sca2(x,y) scanf("%d%d",&x,&y)
  22. #define Scl(x) scanf("%lld",&x);
  23. #define Pri(x) printf("%d\n", x)
  24. #define Prl(x) printf("%lld\n",x);
  25. #define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
  26. #define LL long long
  27. #define ULL unsigned long long
  28. #define mp make_pair
  29. #define PII pair<int,int>
  30. #define PIL pair<int,long long>
  31. #define PLL pair<long long,long long>
  32. #define pb push_back
  33. #define fi first
  34. #define se second
  35. typedef vector<int> VI;
  36. const double eps = 1e-;
  37. const int maxn = 1e6 + ;
  38. const int INF = 0x3f3f3f3f;
  39. const int mod = 1e9 + ;
  40. int N,M,tmp,K;
  41. int dp[ << ];
  42. int a[maxn];
  43. int main()
  44. {
  45. Sca(N);
  46. For(i,,N){
  47. int x; Sca(x); a[i] = x;
  48. dp[x ^ (( << ) - )] = x;
  49. }
  50. for(int i = ( << ) - ; i >= ; i --){
  51. if(!dp[i]){
  52. for(int j = ; j < ; j ++){
  53. if(dp[i | ( << j)]){
  54. dp[i] = dp[i | ( << j)];
  55. break;
  56. }
  57. }
  58. }
  59. }
  60. For(i,,N){
  61. if(dp[a[i]]) printf("%d ",dp[a[i]]);
  62. else printf("-1 ");
  63. }
  64. #ifdef VSCode
  65. system("pause");
  66. #endif
  67. return ;
  68. }

CodeForces165E 位运算 贪心 + 状压dp的更多相关文章

  1. 你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)

    一. 位操作基础 基本的位操作符有与.或.异或.取反.左移.右移这6种,它们的运算规则如下所示: 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ...

  2. POJ 1795 DNA Laboratory (贪心+状压DP)

    题意:给定 n 个 字符串,让你构造出一个最短,字典序最小的字符串,包括这 n 个字符串. 析:首先使用状压DP,是很容易看出来的,dp[s][i] 表示已经满足 s 集合的字符串以 第 i 个字符串 ...

  3. bzoj3717 [PA2014]Pakowanie 贪心+状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3717 题解 这道题大概也就只能算常规的状压 DP 吧,但是这个状态和转移的设计还是不是很好想. ...

  4. BZOJ4560 JLOI2016字符串覆盖(kmp+贪心+状压dp+单调队列)

    首先kmp求出每个子串能放在哪些位置.接下来的两部分贪心和状压都可以,各取比较方便的. 最大值考虑贪心.考虑枚举子串的左端点出现顺序,在此基础上每个子串的位置肯定都应该尽量靠前,有是否与上个子串有交两 ...

  5. 状压DP总结

    状态压缩就是将一行的状态压成一个二进制数,这个数的二进制形式反映了这一行的情况 比如0100111的意义为:这一排的第一个数没被使用,第二个被占用了,第三四个没被占用,第五六七个被占用 我们知道位运算 ...

  6. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  7. 动态规划专题(一)——状压DP

    前言 最近,决定好好恶补一下我最不擅长的\(DP\). 动态规划的种类还是很多的,我就从 状压\(DP\) 开始讲起吧. 简介 状压\(DP\)应该是一个比较玄学的东西. 由于它的时间复杂度是指数级的 ...

  8. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  9. 状压DP操作

    1.’&’符号,x&y,会将两个十进制数在二进制下进行与运算,然后返回其十进制下的值.例如3(11)&2(10)=2(10). 2.’|’符号,x|y,会将两个十进制数在二进制 ...

随机推荐

  1. dom定位的三种元素

    1.通过id #XXX 2.通过标签  xxx 3.通过类  .xxx

  2. codeforces525B

    Pasha and String CodeForces - 525B Pasha got a very beautiful string s for his birthday, the string ...

  3. Nginx 慢启动与拥塞窗口

    L:127

  4. pysphere VMware控制模块的一些函数的说明

    对于虚拟机的操作获得虚拟机对象 当你正常连接了服务器后,你就可以使用以下两种方式来得到虚拟机对象. get_vm_by_path get_vm_by_name 虚拟机路径可以从虚拟机右键信息中的”Ed ...

  5. Codeforces Round #423 Div. 1

    A:暴力赋值即可,并查集维护下一个未被赋值的位置. #include<iostream> #include<cstdio> #include<cmath> #inc ...

  6. HDU 1021 斐波那契

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6404504.html Fibonacci Again Time Limit: 2000/1000 ...

  7. Json中Date映射到model

    @DateTimeFormat(pattern="yyyy-MM-dd") private Date nenddate; public Date getNenddate() { r ...

  8. Flask 构建微电影视频网站(三)

    搭建后台页面 视图函数位于admin文件夹下, app/admin/views.py 管理员登录页面搭建 视图函数 @admin.route('/') def index(): return '后台主 ...

  9. Matplotlib学习---用matplotlib画柱形图,堆积柱形图,横向柱形图(bar chart)

    这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/hot-dog-cont ...

  10. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...