La recta de las preguntas reales diarias de la Copa Puente Azul

fuente del tema

Copa Puente Azul Provincial 2021

Enlace del tema: http://acm.mangata.ltd/p/P1485

centro de pruebas

matemáticas, violencia

Vídeo explicación

https://www.bilibili.com/video/BV1BY411J795

ideas

Como todos los puntos seleccionados son coordenadas enteras, seleccionamos como máximo 21 × 20 = 420 21\times 20 = 4202 1×2 0=4 20 puntos , entonces podemos seleccionar cada dos puntos como una línea recta, pero en este caso, puede haber una selección repetida de una línea, por lo que necesitamos deduplicar, entonces, ¿cómo deduplicar? Sabemos que la ecuación estándar para una recta es:A x + By + C = 0 Ax+By+C = 0una x+por _+C=0 Entonces eso significa que solo necesitamos determinarA , B , CA, B, CA , B , C está bien, pero aquí debes prestar atención aA , B , CA, B, CA , B , C deben simplificarse, de lo contrario no podremos lograr el efecto de desduplicación.Para la desduplicación de la estructura de tres o más elementos, podemos optar por escribir una estructura por nosotros mismos, pero También podemos usarlo directamentevector, luego arrojar cada uno,A, B, CA, B, Cvectorset¿Qué pasa con A , B , C ? , todos conocemos la ecuación de la recta determinada por dos puntos:( y − y 1 ) y 1 − y 2 = x − x 1 x 1 − x 2 \frac{(y - y_1)}{y_1-y_2} = \frac{x-x_1}{x_1-x_2}y1y2(yy1)=X1x2x x1Entonces podemos obtener: ( y 2 − y 1 ) x + ( x 1 − x 2 ) y + ( x 2 y 1 − x 1 y 2 ) = 0 (y_2 - y_1)x + ( x_1-x_2)y + (x_2y_1-x_1y_2) = 0(y2y1) x+( X1X2)y+( X2y1X1y2)=0

Podemos obtener: A = y 2 − y 1 , B = x 1 − x 2 , C = x 2 y 1 − x 1 y 2 A=y_2 - y_1, B=x_1-x_2, C =x_2y_1-x_1y_2UN=y2y1B=X1X2C=X2y1X1y2, luego quitamos los factores comunes de los tres y los ponemos vector, y luego los ponemos setpara completar el cálculo de una línea. Finalmente, solo necesitamos generar setel tamaño del contenedor.

código

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

const double eps = 0.0000001;

int main()
{
    
    
	vector<PII> Point;
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n = 20,m = 21;
//	cin>>n>>m;

	for(int x = 0;x < n; ++x)
		for(int y = 0;y < m; ++y)
			Point.push_back({
    
    x,y});

	int l = Point.size();
	set<vector<int>> ans;
	for(int i = 0;i < l; ++i) {
    
    
		for(int j = i + 1;j < l; ++j) {
    
    
			vector<int> t;
			int x1 = Point[i].first,y1 = Point[i].second;
			int x2 = Point[j].first,y2 = Point[j].second;
			int a,b,c;
			a = y2 - y1;
			b = x1 - x2;
			c = x2 * y1 - x1 * y2;
			int d = __gcd(__gcd(a,b),c);
			t.push_back(a/d);
			t.push_back(b/d);
			t.push_back(c/d);
			ans.insert(t);
		}
	}
	cout<<ans.size()<<endl;
	return 0;
}
/*
ans = 40257
*/

Supongo que te gusta

Origin blog.csdn.net/m0_46201544/article/details/123910901
Recomendado
Clasificación