egogoboy

Ломоносов отбор 4

Nov 18th, 2022 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.93 KB | None | 0 0
  1. /*Сдать решение задачи 4-Измерения температуры
  2. Полный балл:  1
  3. Имя входного файла: input.txt или стандартный поток ввода
  4. Ограничение времени:  1 с
  5. Ограничение реального времени:   5 с
  6. Ограничение памяти:    512M
  7. Задача 4: Измерения температуры
  8. В результате измерения были получены среднедневные температуры за N последовательных дней (1 ≤ N ≤ 10^7)
  9.  
  10. Иннокентий решил найти максимальную температуру на всех последовательных интервалах длины K (1 ≤ K ≤ 10^4, K ≤ N). То есть на отрезках [0..K-1], [1..K], [2..K+1] и т.д.
  11.  
  12. .
  13. Результаты поисков не понравились Иннокентию, поэтому он решил расширить слева и справа каждый i-й отрезок на li, ri соответственно. Считайте, что если при этом происходит выход за границы исходной последовательности, то числа там -inf.
  14.  
  15. На стандартном потоке вводится число N и N чисел задаюших последовательность измерений. Затем K - длина отрезка поиска, затем N-K+1 пары положительных чисел не больших 1000 и не больших K - li, ri соответственно.
  16.  
  17. Для каждого из N-K+1 отрезков длины K c соответствующими расширениями выведите максимум на них
  18.  
  19. Примеры
  20. Входные данные
  21. 10
  22. 1 2 3 1 3   7 8 5 3 1
  23. 3
  24. 0 1
  25. 1 1
  26. 0 1
  27. 0 0
  28. 0 0
  29. 0 0
  30. 0 0
  31. 1 0
  32. Результат работы
  33. 3
  34. 3
  35. 7
  36. 7
  37. 8
  38. 8
  39. 8
  40. 8*/
  41.  
  42.  
  43. #include<iostream>
  44. #include<fstream>
  45. #include<vector>
  46. #include<stdint.h>
  47. #include<algorithm>
  48. #include<cmath>
  49. #define all(container) container.begin(), container.end()
  50. #define fors(counter, start, finish) for (int counter = start; counter < finish; ++counter)
  51. #define forb(counter, start, finish) for (int counter = start; counter >= finish; --counter)
  52. #define vec(type) std::vector<type>
  53. #define dvec(type) std::vector<std::vector<type>>
  54. //#define fin std::cin
  55.  
  56. int main() {
  57.     std::ifstream fin("input.txt");
  58.     int n; fin >> n;
  59.     vec(int) t(n);
  60.     fors(i, 0, n)
  61.         fin >> t[i];
  62.     int k; fin >> k;
  63.     std::vector<std::pair<int, int>> idx(n);
  64.     fors(i, 0, n)
  65.         fin >> idx[i].first >> idx[i].second;
  66.     fors(i, 0, n - k + 1) {
  67.         int ldx = i - idx[i].first, rdx = i + k + idx[i].second;
  68.         int res = 0;
  69.         fors(j, (ldx < 0 ? 0 : ldx), (rdx < t.size() ? rdx : t.size())) {
  70.             res = std::max(res, t[j]);
  71.         }
  72.         std::cout << res << std::endl;
  73.     }
  74.     return 0;
  75. }
  76.  
  77.  
  78.  
  79. #include<iostream>
  80. #include<fstream>
  81. #include<sstream>
  82. #include<vector>
  83. #include<stdint.h>
  84. #include<algorithm>
  85. #define all(container) container.begin(), container.end()
  86. #define fors(counter, start, finish) for (int counter = start; counter < finish; ++counter)
  87. #define forb(counter, start, finish) for (int counter = start; counter >= finish; --counter)
  88. #define vec(type) std::vector<type>
  89. #define dvec(type) std::vector<std::vector<type>>
  90. //#define fin std::cin
  91.  
  92. using namespace std;
  93.  
  94. const int MAXN = 10000000;
  95. pair<int, int> t[4 * MAXN];
  96.  
  97. pair<int, int> combine(pair<int, int> a, pair<int, int> b) {
  98.     if (a.first > b.first)
  99.         return a;
  100.     if (b.first > a.first)
  101.         return b;
  102.     return make_pair(a.first, a.second + b.second);
  103. }
  104.  
  105. void build(int a[], int v, int tl, int tr) {
  106.     if (tl == tr)
  107.         t[v] = make_pair(a[tl], 1);
  108.     else {
  109.         int tm = (tl + tr) / 2;
  110.         build(a, v * 2, tl, tm);
  111.         build(a, v * 2 + 1, tm + 1, tr);
  112.         t[v] = combine(t[v * 2], t[v * 2 + 1]);
  113.     }
  114. }
  115.  
  116. pair<int, int> get_max(int v, int tl, int tr, int l, int r) {
  117.     if (l > r)
  118.         return make_pair(-100000000, 0);
  119.     if (l == tl && r == tr)
  120.         return t[v];
  121.     int tm = (tl + tr) / 2;
  122.     return combine(
  123.         get_max(v * 2, tl, tm, l, min(r, tm)),
  124.         get_max(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r)
  125.     );
  126. }
  127.  
  128. void update(int v, int tl, int tr, int pos, int new_val) {
  129.     if (tl == tr)
  130.         t[v] = make_pair(new_val, 1);
  131.     else {
  132.         int tm = (tl + tr) / 2;
  133.         if (pos <= tm)
  134.             update(v * 2, tl, tm, pos, new_val);
  135.         else
  136.             update(v * 2 + 1, tm + 1, tr, pos, new_val);
  137.         t[v] = combine(t[v * 2], t[v * 2 + 1]);
  138.     }
  139. }
  140.  
  141. int main() {
  142.     std::ifstream fin("input.txt");
  143.     int n; fin >> n;
  144.     int a[MAXN];
  145.     fors(i, 0, n) {
  146.         fin >> a[i];
  147.     }
  148.     int k; fin >> k;
  149.     build(a, 1, 0, n - 1);
  150.     fors(i, 0, n - k + 1) {
  151.         int ldx, rdx;
  152.         fin >> ldx >> rdx;
  153.         int left = max(i - ldx, 0);
  154.         int right = min(i + k + rdx - 1, n - 1);
  155.         auto res = get_max(1, 0, n - 1, left, right);
  156.         std::cout << res.first << std::endl;
  157.     }
  158.  
  159.     return 0;
  160. }
Tags: olimp
Advertisement
Add Comment
Please, Sign In to add comment