【题解】CF1013B And
2024-09-08 13:44:57
题面传送门
解决思路
首先我们可以得出,$ a $ \(\&\) $ x $ \(=\) $ a $ \(\&\) $ x $ \(\&\) $ x $。由此得知,同一个 \(a\) 反复 \(\&\) \(x\) 是没有意义的。所以我们得到,答案仅可能是以下几种情况:
- \(ans = 0\) ,即有相同的数字,不需要操作。
- \(ans = 1\) ,即对于某个 \(a_i\) \(\&\) $ x $ \(=\) \(a_j\),其中 $1 \le i,j\le n $ 且 \(j \ne i\) 。
- \(ans = 2\) ,即对于某两个 \(a_i\) \(\&\) $ x $ \(=\) \(a_j\) \(\&\) $ x $ ,其中 $1 \le i,j\le n $ 且 \(j \ne i\) 。
- \(ans = -1\) ,即对于任意的 \(a_i\) \(\&\) $ x $ \(\ne\) \(a_j\) \(\&\) $ x $ ,其中 $1 \le i,j\le n $ 且 \(j \ne i\) 。
有了这个思路,再看到\(a_i \le 10^5\) ,我们就可以借助桶存下每个 \(a_i\) \(\&\) $ x $ ,然后判断即可。
AC Code
#include<bits/stdc++.h>
using namespace std;
int n,x,a[100005],t[100005],t2[100005],fl;
//t储存a[i]&x,t2用于判重(ans=0的情况)
int main(){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(t2[a[i]]!=0){
printf("0");
return 0; //ans=0的情况
}
t2[a[i]]++;
if((a[i]&x)!=a[i]) t[a[i]&x]++; //a[i]&x=a[i]的不能计算在内
if(t[a[i]&x]>=2) fl=1; //如果出现过两次,就必有解
}
for(int i=1;i<=n;i++){
if(t[a[i]]>0){
printf("1"); //ans=1的情况
return 0;
}
}
if(fl==1) printf("2"); //有解
else printf("-1"); //无解
return 0;
}
最新文章
- centos为用户增加ssh key
- Shell : debug
- margin塌陷现象
- 对象序列化成Json字符串 及 反序列化成对象
- ACM Longest Repeated Sequence
- 【其它】 MathJax - 网页中显示数学公式的终极武器
- org.apache.http.conn.HttpHostConnectException: Connection to http://localhost refused in android
- 使用ContentProvider管理联系人------搜索联系人
- js中Number数字数值运算后值不对
- CSS_position
- 0723掰棒子记录--vue的数据渲染
- Docker bridge br0 pipework
- 二十一、Linux 进程与信号---进程资源限制
- Java 二进制数据转成文件
- POJ 1321 棋盘问题 (dfs)
- MAC下Xcode配置opencv(2017.3.29最新实践,亲测可行)(转)
- C++ 多态Polymorphism 介绍+动态绑定、静态绑定
- 从零实现Lumen-JWT扩展包(序):前因
- 自适应瀑布型布局(手机,PC全兼容)
- 最全的Spring AOP