zoj 3870 异或运算

给你n个数   问有多少种情况  两两异或大于两个数中的最大值;

分析   如果a小于b    及大的为b  要想a^b大于b  及a的最高位(一定为1)与b的对应位不一样   及b的对应位为0  就一定满足   这样就转换为小的数的对应位

先排序   mark【i】表示i这个位置为0的数的个数

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;

int num[100010];
int cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int T,i,j,n;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&num[i]);
		}
		sort(num+1,num+1+n,cmp);
		int record[100],mark[100];
		memset(record,0,sizeof(record));
		int ans=0;
		for(i=1;i<=n;i++)
		{
			j=1;
			int x=num[i];
			while(x)
			{
				mark[j++]=x%2;
				x/=2;
			}
			ans+=record[j-1];
			for(int k=1;k<j;k++)
			if(!mark[k]) record[k]++;
		}
		printf("%d\n",ans);
	}
	return 0;
}
时间: 2024-08-25 00:20:35

zoj 3870 异或运算的相关文章

位运算 ZOJ 3870 Team Formation

题目传送门 1 /* 2 题意:找出符合 A^B > max (A, B) 的组数: 3 位运算:异或的性质,1^1=0, 1^0=1, 0^1=1, 0^0=0:与的性质:1^1=1, 1^0=0, 0^1=0, 0^0=0: 4 假设A < B,一定要满足B的最高位对应A的值是0,这样才可能>B(即0^1=1): 5 然后比赛时假设A的极限是类似0111111的情况,最后假设有误: 6 题解是先把每个数最高位(1)的位置统计个数,1<<4 的意思是 000010000:

HDU 5175 Misaki&#39;s Kiss again (异或运算,公式变形)

Misaki's Kiss again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 201    Accepted Submission(s): 57 Problem Description After the Ferries Wheel, many friends hope to receive the Misaki's kiss

异或运算的性质及用途

 1.两个数的交换  利用异或运算可以实习一种简单的不使用第三个数的交换方式, 代码如下所示: void swap(int a,int b) { a = a^b; b = a^b; a = a^b; }  原因是:异或运算是它本身的逆运算,故对于两个数或是布尔变量有如下性质: (a XOR b) XOR b = a 补充,异或运算的简单性质: 1. a ⊕ a = 0 2. a ⊕ b = b ⊕ a // 异或运算满足交换律 3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕

异或运算实现加密解密

异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能. 异或运算在java中通常有两个比较常用的方法,一个是两个变量的互换(不借助第三个变量),一个便是数据的简单加密解密. 两个变量的互换 java运算中,如果要交换两变量的值,通常的做法就是借助第三个临时变量,然后完成操作. 如 public static void main(String[] args) { int[] arr =

网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.

本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 关于这个问题,网络上面有很多的解释,3种方法,我这里给比较一下各自的优缺点,然后简单分析一下汇编代码,分析代码如下: #include <stdio.h> void swap1(int &a,int &b) { int temp = a; a = b; b = temp; } void swap2(int &a,int &b) { a += b;

ZOJ 3870 数学思维

题意:给你n 个数 ,让你找出其中有多少组数字   a 异或b   大于max(a, b) 题解:首先了解异或运算的方式    相同为0  不同为1    可以知道如果要增大肯定是要不同的位多于相同的位,其次需要知道     2的n次方等于2的n-1次访加到2的1次访再加1,即最高位影响大于低位之和,也就是说只有某个数字它和其他数字最大位不相同,则异或必然大于max(a, b): 代码: #include<stdio.h> #include<iostream> #include&l

异或运算

将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0:否则为1.

【Luogu】P1681最大正方形2(异或运算,DP)

题目链接 不得不说attack是个天才.读入使用异或运算,令que[i][j]^=(i^j)&1,于是原题目变成了求que数组的最大相同值. 然而我还是不理解为啥,而且就算简化成这样我也不会做. ai,我太菜了. f[i][j]表示考虑到i,j为止的最大值.当que[i][j]=que[i-1][j]=que[i][j-1]=que[i-1][j-1]的时候,f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1. #include<cstdi

FEC之异或运算应用

话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a xor a = 0 2). a xor 0 = a 3). (a xor b) xor c = a xor (b xor c) 4). IF a xor b = c THEN a xor c = b    异或的运算特性有两点很好的应用 查找 case 1: 一个数组,除了其中一个元素,其他元素都为