Entrenamiento 2 - Denominación D
Chiaki tiene puntos 3n3n p1, p2, ..., p3np1, p2, ..., P3N. Se garantiza que no hay tres puntos están alineados.
Chiaki le gustaría construir nn disjuntos triángulos donde cada vértice viene de los puntos 3n3n.
Entrada
Existen múltiples casos de prueba. La primera línea de entrada contiene un número entero TT, que indica el número de casos de prueba. Para cada caso de prueba:
La primera línea contiene un número entero nn (1≤n≤10001≤n≤1000) - el número de triángulo para constructo.
Cada una de las siguientes líneas 3n3n contiene dos números enteros xixi y yiyi (-109≤xi, yi≤109-109≤xi, yi≤109).
Se garantiza que la suma de todos nn no exceda 1000010000.
Salida
Para cada caso de prueba, la salida nn líneas contiene tres enteros ai, bi, CIAI, bi, ci (1≤ai, bi, ci≤3n1≤ai, bi, ci≤3n) cada denota los índices de los puntos de la ii-ésimo triángulo utilizar. Si hay varias soluciones, se puede dar salida a ninguno de ellos.
Ejemplo de entrada
1
1
1 2
2 3
3 5
Ejemplo de salida
1 2 3
#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3e3 + 5;
struct Node
{
int x;
int y;
int num;
Node(int xx, int yy, int n)
{
x = xx;
y = yy;
num = n;
}
friend bool operator<(Node a, Node b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
};
vector<Node> v;
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= 3 * n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
v.push_back(Node(a, b, i));
}
sort(v.begin(), v.end());
int i = 1, j = 2, k = 3;
for (int i = 0; i < 3 * n; i += 3)
{
for (int j = 0; j < 3; j++)
printf("%d ", v[i + j].num);
printf("\n");
}
while (v.size())
v.pop_back();
}
}
Idea:
Después de ordenar la salida simple no puede juzgar la violencia.