zoj3870 找规律、二分
来源:互联网 发布:淘宝如何快速刷销量 编辑:程序博客网 时间:2024/05/20 23:36
题意:给你一个数组,问数组中有多少对(x,y)使 x ⊕ y > max(x,y)
题解: 我的解法是 先对数组从小到大排序
然后,对于一个数A,假设它的二进制表示为 11101101
二进制里有两个0
从右往左看,对于第一个0,它在第2位,那么对于任何二进制只有2位的数B(10,11),都能使 A⊕B>max(A,B) (其实max(A,B)=A,因为这样产生的B不可能比A大,A⊕B后,A的一个二进制0变成了1,肯定变大了)
对于第二个0,它在第5位,那么对于任何二进制只有5位的数B(10000,10001…..11111),都能使 A⊕B>max(A,B)
就这样遍历数组中的每一个数即可
#include<bits/stdc++.h>const int INF = 0x3f3f3f3f;const int Maxn = 1000005;#define ll long longusing namespace std;int x[Maxn], pos[33];int main() { int T, N; cin >> T; while (T--) { scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &x[i]); sort(x, x + N); long long ans = 0; for (int i = 1; i < N; i++) { memset(pos, 0, sizeof(pos)); int k = x[i], cnt = 0, p = 0; // cnt -> x[i]二进制中0的个数,p表示0的位置 while (k) { if ((k & 1) == 0) pos[cnt++] = p; k >>= 1; p++; } for (int j = 0; j < cnt; j++) { int a = 1 << pos[j], b = (1 << (pos[j] + 1)) - 1; ans += upper_bound(x, x + i, b) - lower_bound(x, x + i, a); } } printf("%lld\n", ans); }}
0 0
- zoj3870 找规律、二分
- HDU 5439 Aggregated Counting 找规律+二分
- HDU 5587 Array (找规律_二分)
- ZOJ 3768Continuous Login(找规律然后二分)
- 二分+找规律 之 codevs 1083 Cantor表
- FZU 1848 – ZeroZeroZeros (找规律+二分)
- POWEROJ 1168-A F(x)(找规律&二分查找)
- HDU5439 Aggregated Counting (找规律+预处理+二分)
- Codeforces700A Fast As Possible(二分+找规律)
- SPOJ PHT Pigeonhole Tower 预处理+二分 || 找规律
- Codeforces 785C Anton and Fairy Tale 找规律 二分
- HDU-6154 CaoHaha's staff (找规律+二分)
- zoj3870-Team Formation(异或运算+数学规律)
- 找规律
- 找规律!
- 找规律
- 找规律,
- 找规律
- Linux常用命令head,tail,grep,sed,yum,find
- 一个刚入门的小程序
- GitHub for Windows使用教程(二) 分支的使用
- Nginx 单机百万QPS环境搭建
- 第四节:Scala-基础数据类型
- zoj3870 找规律、二分
- jquery使用 Form submission canceled because the form is not connected
- 在shader调用unity内置lightmap和Light Probes
- 产品经理之产品运营-全栈工程师熊盼
- 克鲁斯卡尔算法的java实现
- 第五节:Scala-基本运算
- 新路程------imx6 uboot环境变量的初始化(2)
- 分布式memcache 一致性哈希算法(采用环状数据结构)
- 第六节:判断与循环