Дело в том, мы имеем N пар целых чисел, в качестве примера:Что такое быстрый способ сравнить большой список пар целых чисел?
Мы говорим, что одна пара больше другой, если оба числа из одной пары больше, чем две другие, или если первое число равно, а другое - больше или наоборот. В противном случае, если вы не можете сравнить их таким образом, то вы не можете установить, какой из них больше.
Идея состоит в том, чтобы знать, для каждой пары, сколько пар больше (в примере первая пара больше третьей и последней, поэтому ответ для первого равен 2). Тривиальным решением будет O (n^2), который просто сравнивает каждую пару со всеми остальными и добавляет один к счетчику для каждого положительного совпадения.
Может ли кто-нибудь придумать более быструю идею? Благодаря!
Я выполнил простое решение (N^2), работает чтение с "sumos.in":
#include <iostream>
#include <fstream>
#define forn(i, x, N) for(i=x; i<N; i++)
using namespace std;
ifstream fin("sumos.in");
ofstream fout("sumos.out");
struct sumo{
int peso, altura;
};
bool operator < (sumo A, sumo B) {
if(A.altura == B.altura)
if(A.peso < B.peso)
return true;
else
return false;
else
if(A.peso == B.peso)
if(A.altura < B.altura)
return true;
else
return false;
else
if((A.altura < B.altura) && (A.peso < B.peso))
return true;
else
return false;
}
int L;
sumo T[100000];
int C[100000];
int main()
{
int i, j;
fin >> L;
forn(i, 0, L)
fin >> T[i].peso >> T[i].altura;
forn(i, 0, L)
forn(j, 0, L)
if(j!=i)
if(T[j]<T[i])
C[i]++;
forn(i, 0, L)
fout << C[i] << endl;
return 0;
}
Пример ввода:
10
300 1500
320 1500
299 1580
330 1690
330 1540
339 1500
298 1700
344 1570
276 1678
289 1499
Выходы:
1
2
1
6
3
3
2
5
0
0
Я решил эту проблему, используя дерево сегментов. Если вы хотите увидеть реализацию: http://pastebin.com/Q3AEF1WY
Кажется, было бы проще просто создать массив пар, а затем отсортировать их. Это занимает O (n) пространство и O (n log n) для сортировки. Вам просто нужно написать функцию сравнения и вызвать [qsort] (http://www.cplusplus.com/reference/cstdlib/qsort/). Это то же сложное время, что и дерево сегментов, меньшая потребность в пространстве и намного меньше кода. –