-
G - DP优化+位运算
CodeForces - 165E - 题意:给出数组对于每一个数a[i],找出a中是否存在t,使得t&a[i]=0,若有输出t,没有输出-1,多个t输出任意一个;
- 思路:对于任意一个数x,假设数的最大范围有N位二进制则有x&(((1<<N)-1)^x)=0;
- 那么对于x',未必非得找到x‘,将x'中的任意的1去掉后得到的数temp,也必有temp&x=0;
- 所以令dp[i]表示数i的代替者temp中任意一个数;则对于数x的答案为dp[tot^x]
- 如果i存在a中dp[i]=i;如果不存在dp[i]=i;也就是枚举i中有1的二进制位去寻找i的temp;
-
#include<bits/stdc++.h> using namespace std; #define maxn 1110500 int dp[1<<23],a[maxn]; int tot,n; int main() { while(~scanf("%d",&n)) { memset(dp,-1,sizeof(dp)); for(int i=0; i<n; i++) { scanf("%d",&a[i]); dp[a[i]]=a[i]; } tot=(1<<22)-1; for(int i=0; i<=tot; i++) if(dp[i]==-1) for(int j=0; j<=22; j++) if(i&(1<<j)&&dp[i-(1<<j)]!=-1) dp[i]=dp[i-(1<<j)]; for(int i=0; i<n; i++) printf("%d%c",dp[tot^a[i]],i==n-1?'\n':' '); } return 0; }
Compatible Numbers CodeForces - 状压DP
最新推荐文章于 2021-06-08 18:26:42 发布