diff --git a/client/percentiles2.cpp b/client/percentiles2.cpp new file mode 100644 index 0000000..26a4355 --- /dev/null +++ b/client/percentiles2.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include + +#include +#include + +using namespace std; + +class SlidingWindowPercentile { +public: + SlidingWindowPercentile(int windowSize) + : windowSize(windowSize) {} + + void addNumber(uint64_t num) { + if (windowQueue.size() >= windowSize) { + // Удаляем самый старый элемент + auto oldest = windowQueue.front(); + windowQueue.pop(); + auto it = windowSorted.find(oldest); + if (it != windowSorted.end()) { + windowSorted.erase(it); + } + } + + windowQueue.push(num); + windowSorted.insert(num); + } + + uint64_t getPercentile(int targetPercentile) { + if (windowSorted.empty()) { + return -1; // Окно пусто + } + + int index = (targetPercentile * windowSorted.size()) / 100; + auto it = windowSorted.begin(); + std::advance(it, index); + return *it; + } + +private: + std::queue windowQueue; // Сохраняет элементы в порядке их добавления + std::multiset windowSorted; // Отсортированные элементы окна + int windowSize; +}; + +int main() { + // Пример использования + SlidingWindowPercentile calculator(1000000); // 50-й перцентиль с размером окна 5 + vector p = {50, 80, 90, 99}; + uint64_t num; + + while (fscanf(stdin, "%ld", &num) == 1) { + calculator.addNumber(num); + for (auto pp : p) { + printf("%d: %ld, ", pp, calculator.getPercentile(pp)); + } + printf("\n"); + } + + return 0; +} +