[CodeForces] Codeforces Round # 672 (Div. 2) B. Rock and Lever (Pensamiento y operación de bits)

B. Roca y palanca

límite de tiempo por prueba1 segundo
límite de memoria por prueba256 megabytes
entrada entrada
estándar salida salida estándar
“Debes levantar la presa. Con palanca. Te lo daré.
Debes bloquear el canal. Con una piedra. No te daré la piedra ".

¡Danik necesita con urgencia una roca y una palanca! Obviamente, la forma más fácil de conseguir estas cosas es pedírselas a Hermit Lizard.

Ermitaño Lizard accedió a darle a Danik la palanca. Pero para conseguir una piedra, Danik necesita resolver la siguiente tarea.

Se le da un entero positivo n y una matriz a de enteros positivos. La tarea consiste en calcular el número de pares (i, j) que i <j y ai & aj≥ai⊕aj, donde & denota la operación AND bit a bit, y ⊕ denota la operación XOR bit a bit.

Danik ha resuelto esta tarea. ¿Pero puedes solucionarlo?

Aporte

Cada prueba contiene varios casos de prueba.

La primera línea contiene un entero positivo t (1≤t≤10) que indica el número de casos de prueba. A continuación, se describen los casos de prueba.

La primera línea de cada caso de prueba contiene un entero positivo n (1≤n≤105) - longitud de la matriz.

La segunda línea contiene n números enteros positivos ai (1≤ai≤109) - elementos de la matriz.

Se garantiza que la suma de n en todos los casos de prueba no exceda 105.

Producción

Para cada caso de prueba, imprima un entero no negativo: la respuesta al problema.

Ejemplo

aporte

5
5
1 4 3 7 10
3
1 1 1
4
6 2 5 3
2
2 4
1
1

producción

1
3
2
0
0

Nota
En el primer caso de prueba, solo hay un par: (4,7): para él 4 & 7 = 4, y 4⊕7 = 3.

En el segundo caso de prueba, todos los pares son buenos.

En el tercer caso de prueba hay dos pares: (6,5) y (2,3).

En el cuarto caso de prueba no hay buenos pares.


Título:

En algunos grupos el número de secuencias (i,j)satisface i<j and ai & aj≥ai⊕aj
, es decir, tanto la operativa mayor que o igual tanto operación O exclusiva


Ideas:

La principal es averiguar cuándo los dos números y operaciones serán mayores o iguales que la operación XOR.

Se encuentra que:
① Cuando los dígitos binarios de los dos números son iguales, el primero y debe ser 1, y el primer XOR debe ser 0, por lo que se cumplen las condiciones en este momento

② Cuando los dígitos binarios de los dos números son diferentes, el primero y debe ser 0 , y el primer XOR debe ser 1 , y las condiciones no se cumplen en este momento

Así que encuentra el número con los mismos dígitos binarios para cumplir con la condición

Registre el mismo número de dígitos binarios. Si el número es 4, entonces el número de grupos no repetidos que se pueden combinar es (4 * 3) / 2, es decir, n * (n-1) / 2


Código:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+50;
ll t,n,x;
 
int main()
{
    
    	   
	cin>>t;
	while(t--)
	{
    
    
		map<ll,ll> mp; //记录相同位数的个数
		ll ans=0;
		cin>>n;
		for(int i=0;i<n;i++)
		{
    
    
			cin>>x;
			ll y=x;
			
			ll sum=0;
			while(y>0) //获得二进制位数
			{
    
    
				sum++;
				y>>=1;
			}
			mp[sum]++;
		}
		
		for(auto x:mp)
		{
    
    
			ans+=x.second*(x.second-1)/2; //累加组数
		}
		cout<<ans<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45260385/article/details/110733596
Recomendado
Clasificación