cuatro columnas
Hay cuatro columnas A, B, C, D, cada columna tiene el número de dígitos n. Un número tomado de cada número de la columna respectiva, a preguntar cómo muchos de esos programas y el número 4 es de 0.
Cuando un número de columnas tiene la misma pluralidad de números, a tratarlos como un número diferente.
De entrada de la primera fila: n (número representativo del número de columnas) (1≤n≤4000)
la n-ésima fila siguiente, el i-ésimo fila de cuatro números, cada uno representa el número de columnas A, B, C, D de i dígitos (dígito 2 a la potencia de no más de 28)
el número de salida de diferentes combinaciones
entrada de la muestra:
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45
salida de la muestra:
5
(Respuesta: (- 45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46), (--32, 30, -75, 77) , (-32, -54, 56, 30)
ideas:
- Una primera fuerza de reacción, puede ser calculado a partir de todo el ciclo resultados cuarteto, igual a 0 +. Pero tal es la complejidad de la N- 4 , sin duda será explosivo.
- Por lo tanto, los intentos de utilizar pensamiento binario, se puede enumerar A + B y C + D, respectivamente, los resultados para cada uno de C + D, para averiguar si tiene la opuesto de la A + B.
- Si la violencia directa de encontrar en el A + B en el caso, la complejidad y no mucho más baja, puede primera respuesta a A + B están ordenadas, y luego continuar a utilizar la idea binaria para encontrar, posiciones numéricas bloqueo opuestas (utilizar una búsqueda binaria primera número y ubicación frente a una posición opuesta al último número, la posición del último - en una primera posición opuesta a la + 1 = el número de veces de apariencia)
#include<algorithm>
#include<cmath>
#include<vector>
#include<iostream>
using namespace std;
int a[1000001];
int b[1000001];
int c[1000001];
int d[1000001];
vector<int>ab;
int findbegin(int x)
{
int l=0,r=ab.size()-1,ans=-1;
while(l<=r)
{
int m=(l+r)/2;
if(ab[m]==x)
{
ans=m;
r=m-1;
}
else if(ab[m]>x) r=m-1;
else l=m+1;
}
return ans;
}
int findend(int x)
{
int l=0,r=ab.size()-1,ans=-1;
while(l<=r)
{
int m=(l+r)/2;
if(ab[m]==x)
{
ans=m;
l=m+1;
}
else if(ab[m]>x) r=m-1;
else l=m+1;
}
return ans;
}
int main()
{
int n;
cin>>n;
int ans=0;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i]>>c[i]>>d[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ab.push_back(a[i]+b[j]);
}
}
sort(ab.begin(),ab.end());
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int temp=(c[i]+d[j])*(-1);//枚举c+d,若互为相反数则确定是一组
int l=findbegin(temp);
int r=findend(temp);
if(l!=-1) ans+=(r-l+1);
}
}
cout<<ans<<endl;
return 0;
}