2411. Triángulos

2411. Triángulos

(Archivo IO): entrada: triangles.in salida: triangles.out
Límite de tiempo: 1000 ms Límite de espacio: 262144 KB Límite específico
Ir a conjunto de problemas


Descripción del título

El granjero John quiere construir un pasto triangular para sus vacas. Hay N (3≤N≤10 ^ 5) postes de cerca ubicados en diferentes puntos (X1, Y1) ... (XN, YN) en el plano bidimensional de la granja. Puede elegir tres puntos para formar un pastizal triangular, siempre que un lado del triángulo sea paralelo al eje xy el otro lado sea paralelo al eje y.
¿Cuál es la suma de todas las posibles áreas de pasto que FJ puede componer?

De entrada

La primera línea contiene N.
Cada una de las siguientes N filas contiene dos enteros Xi e Yi, ambos en el rango −10 4 ... 10 4, que describen la posición de un poste de la cerca.

Salida

Como la suma de áreas no es necesariamente un número entero y puede ser muy grande, la suma de las áreas de salidaDos vecesEl resto módulo 10 ^ 9 + 7.

Entrada de muestra

4
0 0
0 1
1 0
1 2

Salida de muestra

3

El rango de datos limita
los puntos de prueba 1-2 a N = 200.
Los puntos de prueba 3-4 satisfacen N≤5000.
Los puntos de prueba 5-10 no tienen restricciones adicionales.

Consejos: Las
estacas de cerca (0,0), (1,0) y (1,2) forman un triángulo con área 1, y (0,0), (1,0) y (0,1) forman un triángulo Un triángulo con un área de 0.5. Entonces la respuesta es 2 * (1 + 0.5) = 3.

Método 1:
enumeramos un punto (i) a la vez, y luego encontramos sumx [i] (la suma de la distancia entre el punto i y el punto i y el punto i) y sumy [i] (mismo punto que i La distancia entre el punto de coordenadas y el punto i); y luego encuentre el área total del triángulo con el punto i como el vértice (sumx [i] * sumy [i]);

	sumx[p[i].num]=sumx[p[i-1].num]+(2*k-2-tot)*d;

El punto con la misma coordenada y se puede calcular a partir de la distancia y la extrapolación de un punto, de modo que no sea necesario repetir el cálculo, reduciendo así la complejidad temporal del programa;

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int Mod=1e9+7;
const int N=1e5+10;
struct node
{
	long long x,y,num;
} p[N];
long long n,sumx[N],sumy[N];
bool cmp1(node xx,node yy) {return (xx.y==yy.y)?xx.x<yy.x:xx.y<yy.y;}
bool cmp2(node xx,node yy) {return (xx.x==yy.x)?xx.y<yy.y:xx.x<yy.x;}
int main()
{
	fre(triangles);
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y),p[i].num=i;
	sort(p+1,p+1+n,cmp1);	
	int t,tot,k;
	p[0].x=p[0].y=-10000000;
	for(int i=1;i<=n;i++)
	{
		if(p[i].y!=p[i-1].y) t=i,tot=0,k=1;
		else
		{
			k++;
			int d=p[i].x-p[i-1].x;
			sumx[p[i].num]=sumx[p[i-1].num]+(2*k-2-tot)*d;
			continue;
		}
		for(int j=t;j<=n;j++)
		{
			if(p[i].y==p[j].y) sumx[p[i].num]+=p[j].x-p[i].x,tot++;
			else break;
		}
	}
	sort(p+1,p+1+n,cmp2);	
	t=1;
	for(int i=1;i<=n;i++)
	{
		if(p[i].x!=p[i-1].x) t=i,tot=0,k=1;
		else
		{
			k++;
			int d=p[i].y-p[i-1].y;
			sumy[p[i].num]=sumy[p[i-1].num]+(2*k-2-tot)*d;
			continue;
		}
		for(int j=t;j<=n;j++)
		{
			if(p[i].x==p[j].x) sumy[p[i].num]+=p[j].y-p[i].y,tot++;
			else break;
		}
	}
	long long ans=0;
	for(int i=1;i<=n;i++) ans+=(sumx[i]*sumy[i])%Mod,ans%=Mod;
	printf("%lld",ans);
	return 0;
}

Método 2:
es diferente del Método 1: solo divide el área total de un triángulo en cuatro cuadrantes. Por supuesto, la distancia y la fórmula serán diferentes.

sumx [xx] = (sumx [xx] + abs (sx [xx] -aa) * (tx [xx] -1)) ;

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=100010;
const int Mod=1e9+7;
struct node
{
	long long x,y;
} p[N];
int n,ans;
bool cmp1(node xx,node yy) {return (xx.x!=yy.x)?xx.x<yy.x:xx.y<yy.y;}
bool cmp2(node xx,node yy) {return (xx.x!=yy.x)?xx.x<yy.x:xx.y>yy.y;}
bool cmp3(node xx,node yy) {return (xx.x!=yy.x)?xx.x>yy.x:xx.y<yy.y;}
bool cmp4(node xx,node yy) {return (xx.x!=yy.x)?xx.x>yy.x:xx.y>yy.y;}
void js()
{
	long long tx[20010]={},ty[20010]={};
	long long sumx[20010]={},sumy[20010]={};
	long long sx[20010]={},sy[20010]={};
	for(int i=1;i<=n;i++)
	{
		int xx=p[i].x,yy=p[i].y;
		tx[xx]++;
		sumx[xx]=(sumx[xx]+abs(sx[xx]-yy)*(tx[xx]-1))%Mod;
		sx[xx]=yy;
		
		ty[yy]++;
		sumy[yy]=(sumy[yy]+abs(sy[yy]-xx)*(ty[yy]-1))%Mod;
		sy[yy]=xx;
		ans=(ans+sumx[xx]*sumy[yy])%Mod;
	}
}
int main()
{
	fre(triangles);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y,p[i].x+=10000,p[i].y+=10000;
	sort(p+1,p+1+n,cmp1); js(); 
	sort(p+1,p+1+n,cmp2); js(); 
	sort(p+1,p+1+n,cmp3); js(); 
	sort(p+1,p+1+n,cmp4); js();
	cout<<ans<<endl;
	return 0;
}
130 artículos originales publicados · ganó 93 · vistas 6804

Supongo que te gusta

Origin blog.csdn.net/bigwinner888/article/details/105345136
Recomendado
Clasificación