#include <iostream>
using namespace std;
void sortowanie(int* tab, int lewy, int prawy)
{
int i = lewy - 1, j = prawy + 1;
int pivot = tab[(lewy + prawy) / 2];
while (1)
{
while (pivot > tab[++i]);
while (pivot < tab[--j]);
if (i <= j)
swap(tab[i], tab[j]);
else
break;
}
if (j > lewy)
sortowanie(tab, lewy, j);
if (i < prawy)
sortowanie(tab, i, prawy);
}
int main()
{
int n, i, k = 0, l = 1, j, rozmiar1 = 0, rozmiar2 = 0, m, wynik = 0;
cin >> n;
int* tab = new int[3*n];
for (i = 0; i < 3*n; i+=3)
{
cin >> tab[i] >> tab[i + 1] >> tab[i + 2]; //tab[0] r , tab[1] w , tab[2] t
}
int* r1 = new int[2*n];
for (i = 0, j = 0; i < 3*n; i+=3)
{
if (tab[i] == 1)
{
r1[j] = tab[i+1];
r1[j + 1] = tab[i + 2];
j += 2;
rozmiar1 += 2;
}
}
int* r2 = new int[2*n];
for (i = 0, j = 0; i < 3 * n; i += 3)
{
if (tab[i] == 2)
{
r2[j] = tab[i + 1];
r2[j + 1] = tab[i + 2];
j += 2;
rozmiar2 += 2;
}
}
delete[] tab;
rozmiar1 = rozmiar1 / 2;
int* s1 = new int[rozmiar1];
for (i = 0, j = 0; i < rozmiar1 * 2; i += 2)
{
s1[j] = r1[i] - r1[i + 1];
j++;
}
rozmiar2 = rozmiar2 / 2;
int* s2 = new int[rozmiar2];
for (i = 0, j = 0; i < rozmiar2 * 2; i += 2)
{
s2[j] = r2[i] - r2[i + 1];
j++;
}
delete[] r1;
delete[] r2;
sortowanie(s1, 0, rozmiar1 - 1);
sortowanie(s2, 0, rozmiar2 - 1);
for (i = 0; i < rozmiar1; i++)
{
m = s1[i];
if (i != rozmiar1 - 1)
{
if (s1[i + 1] == m)
{
l++;
continue;
}
}
for (j = 0; j < rozmiar2; j++)
{
if (s2[j] == m)
{
k++;
while (true)
{
if (s2[j + 1] != m)
break;
k++;
j++;
}
if (k < l)
wynik = wynik + k;
else
wynik = wynik + l;
k = 0;
l = 1;
}
}
}
cout << wynik;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> using namespace std; void sortowanie(int* tab, int lewy, int prawy) { int i = lewy - 1, j = prawy + 1; int pivot = tab[(lewy + prawy) / 2]; while (1) { while (pivot > tab[++i]); while (pivot < tab[--j]); if (i <= j) swap(tab[i], tab[j]); else break; } if (j > lewy) sortowanie(tab, lewy, j); if (i < prawy) sortowanie(tab, i, prawy); } int main() { int n, i, k = 0, l = 1, j, rozmiar1 = 0, rozmiar2 = 0, m, wynik = 0; cin >> n; int* tab = new int[3*n]; for (i = 0; i < 3*n; i+=3) { cin >> tab[i] >> tab[i + 1] >> tab[i + 2]; //tab[0] r , tab[1] w , tab[2] t } int* r1 = new int[2*n]; for (i = 0, j = 0; i < 3*n; i+=3) { if (tab[i] == 1) { r1[j] = tab[i+1]; r1[j + 1] = tab[i + 2]; j += 2; rozmiar1 += 2; } } int* r2 = new int[2*n]; for (i = 0, j = 0; i < 3 * n; i += 3) { if (tab[i] == 2) { r2[j] = tab[i + 1]; r2[j + 1] = tab[i + 2]; j += 2; rozmiar2 += 2; } } delete[] tab; rozmiar1 = rozmiar1 / 2; int* s1 = new int[rozmiar1]; for (i = 0, j = 0; i < rozmiar1 * 2; i += 2) { s1[j] = r1[i] - r1[i + 1]; j++; } rozmiar2 = rozmiar2 / 2; int* s2 = new int[rozmiar2]; for (i = 0, j = 0; i < rozmiar2 * 2; i += 2) { s2[j] = r2[i] - r2[i + 1]; j++; } delete[] r1; delete[] r2; sortowanie(s1, 0, rozmiar1 - 1); sortowanie(s2, 0, rozmiar2 - 1); for (i = 0; i < rozmiar1; i++) { m = s1[i]; if (i != rozmiar1 - 1) { if (s1[i + 1] == m) { l++; continue; } } for (j = 0; j < rozmiar2; j++) { if (s2[j] == m) { k++; while (true) { if (s2[j + 1] != m) break; k++; j++; } if (k < l) wynik = wynik + k; else wynik = wynik + l; k = 0; l = 1; } } } cout << wynik; return 0; } |
English