Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <cstdlib>
- #include <algorithm>
- using namespace std;
- int count_unique(vector<double> & v, bool sort_flag = true) {
- // подсчет количества уникальных элементов в векторе v
- // v - исходный вектор из вещественных чисел
- // sort_flag - требуется ли сортировка вектора
- // false - нет, вектор уже отсортирован
- // true - да, вектор еще не отсортирован (по умолчанию)
- if (sort_flag) // если требуется сортировка
- sort(v.begin(), v.end()); // Сортируем вектор по возрастанию
- // Подсчет количества уникальных элементов
- int count = 1; // Изначально один уникальный элемент
- for (int i = 1; i < (int) v.size(); ++i)
- count += (v[i-1] < v[i]); // Увеличиваем счетчик, если элемент слева меньше элемента справа
- return count; // возвращаем значение счетчика
- }
- void random_vector(int n, vector<double> & v, bool assign_flag = true) {
- // генератор n случайных точек
- // n - количество точек
- // v - вектор, куда будут точки записаны
- // assign_flag - флаг, отвечающий за то, нужно ли выделить под n точек место
- // true - да, под вектор еще не выделено место (по умолчанию)
- // false - нет, в вектор влезет указанное количество точек
- if (assign_flag) // Если нужно выделить место под вектор
- v.assign(n, 0); // Выделяем n ячеек, заполняя нулями
- for (int i = 0; i < n; ++i) // Заполняем арктангенсами от случайных чисел из диапазона [-10000..10000]
- v[i] = atan2(rand() % 20001-10000, rand() % 20001-10000);
- }
- void researching(int n) {
- // Исследование времени работы программы от n точек
- vector<double> v; // объявляем вектор из вещественных чисел
- random_vector(n, v); // заполняем случайными точками
- count_unique(v); // считаем уникальные арктангенсы
- }
- int main() {
- freopen("input.txt", "rt", stdin); // файл на чтение
- freopen("output.txt", "wt", stdout); // файл на вывод
- researching(1750000); // запускаем исследование 1.750.000 точек
- // Далее рещаем задачу
- int n; // количество точек
- scanf("%d", &n); // считываем количество точек из файла
- vector<double> v(n); // выделяем память под вектор из n элементов
- for (int i = 0, x, y; i < n; ++i) { // в цикле по всем точкам
- scanf("%d %d", &x, &y); // считываем текущую точку
- v[i] = atan2(x, y); // записываем арктангенс от нее
- }
- printf("%d", count_unique(v)); // Выводим количество уникальных арктангенсов
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement