博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
福建工程学院第十四届ACM校赛B题题解
阅读量:5339 次
发布时间:2019-06-15

本文共 994 字,大约阅读时间需要 3 分钟。

第二集,未来的我发量这么捉急的吗

题意:

有n个数,请问有多少对数字(i,j)(1<=i<j<=n),满足(a[i]^a[j])+((a[i]&a[j])<<1)=k

思路:

仔细观察不难发现这个位运算有点不一般,其实(a[i]^a[j])+((a[i]&a[j])<<1)这个是等价于a[i]+a[j]的,具体的原理是这样的,我们模拟一下二进制下的加法,如果这一位都是0,加完之后还是0,如果这一位是一个0和一个1,加完之后变成了1,如果这一位都是1,加完之后又就变成了0,然后向前进位,可以观察到在不考虑进位的情况下,二进制加法和异或的性质是一样的,0+0=0,0+1=1+0=1,1+1=0,然后我们发现a[i]&a[j]其实是把二进制都为1的位置提取了出来,因为两个数都为1的情况是需要进位的,所以这里模拟二进制加法,多了个(a[i]&a[j])<<1这样的进位量。

代码实现

这题代码挺简单,排序双指针或者标记都行,map标记代码如下:

#include 
#include
#include
using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e5+7;int a[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); int T; cin>>T; while(T--){ map
mp; int n,k; cin>>n>>k; ll ans=0; for(int i=1;i<=n;i++){ cin>>a[i]; ans+=mp[k-a[i]]; mp[a[i]]++; } cout<
<

 

转载于:https://www.cnblogs.com/xseventh/p/10878237.html

你可能感兴趣的文章
adb命令
查看>>
SQL自定义排序 ORDER BY
查看>>
Modal模态框scrolltop保留上次位移的解决方案
查看>>
python 函数(一)
查看>>
我说我在总结谁会信。。
查看>>
数据库索引的作用和长处缺点
查看>>
Laravel 安装代码智能提示扩展「laravel-ide-helper」
查看>>
java开发配套版本
查看>>
MySQL的 Grant命令权限分配
查看>>
非阻塞的c/s,epoll服务器模型
查看>>
YII框架安装过程总结
查看>>
HDOJ(HDU) 1862 EXCEL排序(类对象的快排)
查看>>
Codeforces Round #381 (Div. 2) 复习倍增//
查看>>
Money类型转化为String去除小数点后0解决方法
查看>>
ArcScene 高程不同的表面无法叠加
查看>>
[ONTAK2010] Peaks
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>