Advertisement
Guest User

kth_statistics

a guest
Oct 20th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <cstring>
  5. #include <unordered_map>
  6. #include <algorithm>
  7. #include <deque>
  8. #include <random>
  9.  
  10. using std::size_t;
  11.  
  12. const std::string TASK_NAME = "kth";
  13.  
  14. std::random_device rd;
  15. std::mt19937 rng(rd());
  16.  
  17. int32_t find_kth(std::vector<int32_t> &vector, size_t k, size_t l = 0, size_t r = static_cast<size_t>(-1));
  18.  
  19. size_t split(std::vector<int32_t> &vector, size_t l, size_t r);
  20.  
  21. template<typename T>
  22. constexpr T find_median(T x1, T x2, T x3);;
  23.  
  24. void solve(std::istream &in, std::ostream &out) {
  25.     size_t n, k;
  26.     in >> n >> k;
  27.     --k;
  28.     int32_t a, b, c;
  29.     in >> a >> b >> c;
  30.  
  31.     std::vector<int32_t> xs(n);
  32.     in >> xs[0];
  33.     if (n != 1) {
  34.         in >> xs[1];
  35.     }
  36.     for (std::size_t i = 2; i < n; ++i) {
  37.         xs[i] = a * xs[i - 2] + b * xs[i - 1] + c;
  38.     }
  39.  
  40.     out << find_kth(xs, k) << std::endl;
  41. }
  42.  
  43. int main(int argc, char *argv[]) {
  44.     bool is_local = argc >= 2 && strcmp(argv[1], "LOCAL") == 0;
  45.     if (is_local) {
  46.         std::ifstream fin("input.txt", std::ifstream::in);
  47.         solve(fin, std::cout);
  48.     } else {
  49.         std::ifstream fin(TASK_NAME + ".in", std::ifstream::in);
  50.         std::ofstream fout(TASK_NAME + ".out", std::ofstream::out);
  51.         solve(fin, fout);
  52.     }
  53.     return 0;
  54. }
  55.  
  56. int32_t find_kth(std::vector<int32_t> &vector, size_t k, size_t l, size_t r) {
  57.     if (r == -1) {
  58.         r = vector.size();
  59.     }
  60.  
  61.     size_t m = split(vector, l, r);
  62.     while (k != m) {
  63.         if (k < m) {
  64.             r = m;
  65.         } else {
  66.             l = m;
  67.         }
  68.         m = split(vector, l, r);
  69.     }
  70.  
  71.     return *std::min_element(vector.begin() + m, vector.begin() + r);
  72. }
  73.  
  74. size_t split(std::vector<int32_t> &vector, size_t l, size_t r) {
  75.     if (r - l <= 1) {
  76.         return l;
  77.     }
  78.  
  79.     std::uniform_int_distribution<size_t> next_random(l, r - 1);
  80.  
  81.     size_t ind1 = next_random(rng);
  82.     size_t ind2 = next_random(rng);
  83.     size_t ind3 = next_random(rng);
  84.     int32_t pivot = find_median(vector[ind1], vector[ind2], vector[ind3]);
  85.     size_t lm = r - 1;
  86.     size_t rm = l;
  87.     while (rm <= lm) {
  88.         while (vector[rm] < pivot) {
  89.             ++rm;
  90.         }
  91.         while (vector[lm] > pivot) {
  92.             --lm;
  93.         }
  94.         if (rm <= lm) {
  95.             std::swap(vector[rm++], vector[lm]);
  96.             lm = lm == 0 ? 0 : lm - 1;
  97.         }
  98.     }
  99.     return lm + 1;
  100. }
  101.  
  102. template<typename T>
  103. constexpr T find_median(T x1, T x2, T x3) {
  104.     if (std::min(x1, x2) != std::min(x2, x3)) {
  105.         return std::max(std::min(x1, x2), std::min(x2, x3));
  106.     } else {
  107.         return std::min(x1, x3);
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement