egogoboy

всесиб 4

Nov 27th, 2022
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.49 KB | None | 0 0
  1. /*Задача 4. Вадим и телефонный звонок
  2. Имя входного файла: input.txt
  3. Имя выходного файла: output.txt
  4. Ограничение по времени: 3 секунды, для Java — 5 секунд
  5. Ограничение по памяти: 256 мегабайт
  6. — Ты опять не выходишь на связь,
  7. Вадим?
  8. Думая о том, что завтра он снова сможет полакомиться любимым лимонадом из очередной бутылки, подаренной фанатами, Вадим услышал телефонный звонок. Вадим взглянул
  9. на телефон — звонит школьный товарищ, с которым он давно не общался, а о многом так
  10. хочется поговорить... Он немедленно схватил трубку, ответил на вызов и ... в ответ услышал лишь шипение. Очевидно — плохая связь. К нему тотчас же нагрянуло воспоминание
  11. из детства, городская легенда, гласившая о том, что якобы, если произнести определенные
  12. слова во время разговора, то связь улучшится.
  13. Вадим откопал у себя старый блокнот, в который он записывал слова, которые, как ему
  14. казалось, улучшают качество связи. Он бегло произнес пару слов из блокнота и, о чудо, связь
  15. улучшилась. После продолжительного разговора ему стало интересно, сколькими способами
  16. он может произнести слова, чтобы увеличить качество связи на некоторое значение. Внутреннее чувство тревоги подсказывает ему, что превосходить некоторый порог может быть
  17. опасно. Ведь всем известно, что лучшее — враг хорошего. Связь может вообще оборваться.
  18. Формат входных данных
  19. В первой строке входного файла записано целое число 𝑁 — количество слов в блокноте
  20. (1 6 𝑁 6 105
  21. ).
  22. В следующей строке заданы 𝑁 чисел, каждое из которых означает, на сколько улучшается
  23. связь при произнесении соответствующего слова из блокнота (1 6 𝑎𝑖 6 99, 1 6 𝑖 6 𝑁).
  24. В последней строке записаны два числа 𝐿 и 𝑅 — минимальное значение, на которое
  25. необходимо улучшить качество связи и порог, превосходить который чрезвычайно опасно
  26. (1 6 𝐿 6 𝑅 6 1018).
  27. Формат выходных данных
  28. В выходной файл необходимо вывести одно число — количество различных способов произнести слова из блокнота, чтобы улучшить связь, не превосходя заданный порог.
  29. Поскольку ответ может быть достаточно большим, выведите остаток от деления его на
  30. число 998244353.
  31. Два способа считаются различными, если в некоторый момент времени были произнесены
  32. различные слова.
  33. Система оценки
  34. Баллы за каждую подзадачу начисляются только в случае, если все тесты для этой подзадачи и необходимых подзадач успешно пройдены.
  35. Страница 8 из 14
  36. Всесибирская открытая олимпиада школьников по информатике
  37. Отборочный очный этап, 9-11 классы, 27 ноября 2022 г.
  38. Подзадача Баллы Ограничения Необходимые подзадачи
  39. 1 0 Тесты из условия
  40. 2 6 1 6 𝑁 6 5; 1 6 𝑎𝑖 6 10; 1 6 𝐿 6 𝑅 6 10 1
  41. 3 14 1 6 𝑁 6 100; 1 6 𝑎𝑖 6 99; 1 6 𝐿 6 𝑅 6 100 1, 2
  42. 4 12 1 6 𝑁 6 105
  43. ; 1 6 𝑎𝑖 6 99; 1 6 𝐿 6 𝑅 6 106
  44. среди 𝑎𝑖 не более 2 различных значений 1
  45. 5 18 1 6 𝑁 6 105
  46. ; 1 6 𝑎𝑖 6 99; 1 6 𝐿 6 𝑅 6 5 · 104 1, 2, 3
  47. 6 20 𝑅 − 𝐿 6 100 1, 2, 3
  48. 7 30 Нет дополнительных ограничений 1, 2, 3, 4, 5, 6
  49. Примеры
  50. input.txt output.txt
  51. 2
  52. 1 2
  53. 1 3
  54. 6
  55. 1
  56. 2
  57. 3 3
  58. 0
  59. 2
  60. 1 2
  61. 1 10
  62. 231
  63. Замечание
  64. Пусть в первом примере есть два слова: 𝐴 и 𝐵 соответственно, тогда допустимыми будут
  65. следующие способы: 𝐴, 𝐵, 𝐴𝐴, 𝐴𝐵, 𝐵𝐴, 𝐴𝐴𝐴.
  66. Во втором примере не существует ни одного способа, удовлетворяющего условию*/
  67.  
  68.  
  69. #include<iostream>
  70. #include<vector>
  71. #include<stdint.h>
  72. #include<fstream>
  73. #include<string>
  74. #include<algorithm>
  75. #include<map>
  76. #define all(container) (container.begin(), container.end())
  77. #define fors(counter, start, finish) for (int counter = start; counter < finish; ++counter);
  78. #define forb(counter, start, finish) for (int counter = start; counter >= finish; --counter);
  79. #define vec(type) std::vector<type>
  80. #define dvec(type) std::vector<std::vector<type>>
  81. #define ll int64_t
  82. //#define fin std::cin
  83. //#define fout std::cout
  84.  
  85. int main() {
  86.     std::ifstream fin("input.txt");
  87.     std::ofstream fout("output.txt");
  88.     ll n, min, max, ans = 0;
  89.     fin >> n;
  90.     vec(int) w(n);
  91.     w.resize(n);
  92.     std::map<ll, ll> res;
  93.     for (int i = 0; i < n; ++i) {
  94.         fin >> w[i];
  95.         res[w[i]]++;
  96.     }
  97.     fin >> min >> max;
  98.  
  99.     for (std::pair<ll, ll> i : res) {
  100.         for (int j = 0; j < w.size(); ++j) {
  101.             if (w[j] + i.first <= max)
  102.                 res[w[j] + i.first] += res[i.first] % 998244353;
  103.         }
  104.     }
  105.  
  106.     for (std::pair<ll, int> i : res) {
  107.         if (i.first <= max && i.first >= min)
  108.             ans += res[i.first];
  109.     }
  110.     fout << ans << std::endl;
  111.     return 0;
  112. }
Tags: olimp
Advertisement
Add Comment
Please, Sign In to add comment