Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
:: Данные вводятся с клавиатуры или из файла input.txt, выводятся на экран или в файл output.txt.
Первые тесты не всегда совпадают с примерами из условия. ::
Задача A. RMQ
Ограничение по времени, сек
1.5
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C
GNU C++
Delphi Java Haskell
Min время, сек 0.155 0.101 0.1 0.127 0.652 1.175
Среднее время, сек
0.372 0.189 0.491 0.698 1.163 1.175
Верных решений
118 7 768 130 33 1
Реализуйте структуру данных, которая на данном массиве из N целых чисел позволяет
узнать максимальное значение на этом массиве и индекс элемента, на котором достигается это
максимальное значение.
Входные данные
В первой строке вводится натуральное число N (1 ≤ N ≤ 105) – количество элементов в массиве. В
следующей строке содержатся N целых чисел, не превосходящих по модулю 109 – элементы массива.
Далее идет число K (0 ≤ K ≤ 105) – количество запросов к структуре данных. Каждая из
следующих K строк содержит два целых числа l и r (1 ≤ l ≤ r ≤ N) – левую и правую границы отрезка в
массиве для данного запроса.
Выходные данные
Для каждого из запросов выведите два числа: наибольшее значение среди элементов массива на
отрезке от l до r и индекс одного из элементов массива, принадлежащий отрезку от l до r, на котором
достигается этот максимум.
Примеры
входные данные
5
7 3 1 6 4
3
1 5
2 4
3 3
выходные данные
7 1
6 4
1 3
входные данные
1
0
1
1 1
выходные данные
0 1
входные данные
2
0 1
3
1 1
1 2
2 2
выходные данные
0 1
1 2
1 2
Задача B. Суммы на подотрезках с изменением элемента
Ограничение по времени, сек
2
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C
GNU C++
Delphi Java Python 2.7
Mono C#
Python 3.1
Min время, сек
0.063 0.041 0.04 0.044 0.54 1.644 0.476 0.968
Среднее время, сек
0.088 0.041 0.148 0.092 0.928 1.644 0.476 1.268
Верных решений
8 1 203 31 3 1 1 16
Реализуйте эффективную структуру данных, позволяющую изменять элементы
массива и вычислять суммы нескольких подряд идущих элементов.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (s — вычислить сумму, u —
обновить значение элемента).
Следом за s вводятся два числа — номера левой и правой границы отрезка.
Следом за u вводятся два числа — номер элемента и его новое значение.
Выходные данные
Для каждого запроса s выведите результат. Все числа выводите в одну строку
через пробел.
Примеры
входные данные
10
613 263 312 670 216 142 976 355 488 370
10
s 2 7
s 4 8
u 7 969
u 1 558
s 2 7
u 2 731
s 4 9
s 1 3
u 8 76
u 5 377
выходные данные
2579 2359 2572 2840 1601
Задача C. Номер максимума на подотрезке с изменением элемента
Ограничение по времени, сек 3
Ограничение по памяти, мегабайт
64
Язык GNU C++
Delphi Python 2.7
Python 3.1
Min время, сек 0.047 0.043 1.838 1.282
Среднее время, сек
0.22 0.106 1.838 1.599
Верных решений 24 18 1 13
Реализуйте эффективную структуру данных, позволяющую изменять элементы
массивы и вычислять номер максимального элемента из нескольких подряд идущих
элементов.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (s — вычислить номер максимума,
u — обновить значение элемента).
Следом за s вводятся два числа — номера левой и правой границы отрезка.
Следом за u вводятся два числа — номер элемента и его новое значение.
Выходные данные
Для каждого запроса s выведите результат. Все числа выводите в одну строку
через пробел.
Примеры
входные данные
5
2 4 1 3 5
3
s 2 4
u 1 10
s 1 3
выходные данные
2 1
Задача D. НОД на подотрезках с изменением элемента
Ограничение по времени, сек
2.5
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C++
Delphi Java Python 2.7
Mono C#
Python 3.1
Min время, сек
0.619 0.053 0.05 0.809 2.216 0.197 1.473
Среднее время, сек
0.619 0.16 0.092 1.528 2.216 0.197 1.63
Верных решений
1 52 17 2 1 1 10
Реализуйте эффективную структуру данных, позволяющую изменять элементы
массивы и вычислять НОД нескольких подряд идущих элементов.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (s — вычислить НОД, u — обновить
значение элемента).
Следом за s вводятся два числа — номера левой и правой границы отрезка.
Следом за u вводятся два числа — номер элемента и его новое значение.
Выходные данные
Для каждого запроса s выведите результат. Все числа выводите в одну строку
через пробел.
Примеры
входные данные
5
2 8 4 16 12
5
s 1 5
s 4 5
u 3 32
s 2 5
s 3 3
выходные данные
2 4 4 32
Задача E. k-й ноль на интервале, c изменением элемента
Ограничение по времени, сек 2
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C++
Delphi Python 2.7
Min время, сек 0.068 0.052 0.128 1.454
Среднее время, сек
0.094 0.278 0.128 1.454
Верных решений 4 20 1 1
Реализуйте эффективную структуру данных, позволяющую изменять элементы
массива и вычислять индекс k-го слева нуля на данном интервале в массиве.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (s — вычислить индекс k-го нуля,
u — обновить значение элемента).
Следом за s вводится три числа — левый и правый концы интервала и число k
(1 ≤ k ≤ N).
Следом за u вводятся два числа — номер элемента и его новое значение.
Выходные данные
Для каждого запроса s выведите результат. Все числа выводите в одну строку
через пробел. Если нулей на запрашиваемом интервале нет, выводите -1 для
данного запроса.
Примеры
входные данные
5
0 0 3 0 2
3
u 1 5
u 1 0
s 1 5 3
выходные данные
4
Задача F. Количество максимумов на отрезке с изменением элемента
Язык GNU C++ Delphi Python 2.7
Min время, сек 0.046 0.072 2.245
Среднее время, сек 0.173 0.072 2.245
Верных решений 34 1 1
Реализуйте эффективную структуру данных, позволяющую изменять элементы массива и вычислять количество максимальных элементов массива из нескольких подряд идущих элементов.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество чисел в
массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 1000000) — количество запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала вводится одна
буква, кодирующая вид запроса (s — вычислить количество максимумов, u — обновить значение элемента).
Следом за s вводятся два числа — номера левой и правой границы отрезка.
Следом за u вводятся два числа — номер элемента и его новое значение.
Выходные данные Для каждого запроса s выведите результат. Все числа выводите в одну строку через пробел.
Примечание: Решения, верно работающие при M <= 30000, будут оцениваться в 30 баллов.
Примеры
входные данные
5
1 3 2 3 3
5
s 1 4
u 3 3
s 1 5
u 2 1
s 1 5
выходные данные
2 4 3
Ограничение по времени, сек 1
Ограничение по памяти, мегабайт 64
Задача G. Дерево интервалов с обновлением на отрезке
Ограничение по времени, сек
2
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C++
Delphi Java Python 2.7
Mono C#
Min время, сек 0.062 0.043 0.044 0.708 1.584 0.206
Среднее время, сек
0.11 0.184 0.121 0.764 1.584 0.285
Верных решений
11 105 19 2 1 2
Реализуйте эффективную структуру данных для хранения элементов и увеличения
нескольких подряд идущих элементов на одно и то же число.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (g — получить текущее значение
элемента по его номеру, a — увеличить все элементы на отрезке).
Следом за g вводится одно число — номер элемента.
Следом за a вводятся три числа — левый и правый концы отрезка и число add, на
которое нужно увеличить все элементы данного отрезка массива (0 ≤ add ≤ 100000).
Выходные данные
Выведите в одну строку через пробел ответы на каждый запрос g.
Примеры
входные данные
5
2 4 3 5 2
5
g 2
g 5
a 1 3 10
g 2
g 4
выходные данные
4
2
14
5
Задача H. Максимум на подотрезках с добавлением на отрезке
Ограничение по времени, сек
4
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C++
Delphi Java Python 2.7
Mono C#
Min время, сек 0.12 0.064 0.081 0.808 3.633 0.23
Среднее время, сек
0.207 0.277 0.237 1.164 3.633 0.33
Верных решений
6 95 12 2 1 5
Реализуйте эффективную структуру данных для хранения массива и выполнения
следующих операций: увеличение всех элементов данного интервала на одно и то
же число; поиск максимума на интервале.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (m — найти максимум, a —
увеличить все элементы на отрезке).
Следом за m вводятся два числа — левая и правая граница интервала.
Следом за a вводятся три числа — левый и правый концы отрезка и число add, на
которое нужно увеличить все элементы данного отрезка массива (0 ≤ add ≤ 100000).
Выходные данные
Выведите в одну строку через пробел ответы на каждый запрос m.
Примеры
входные данные
5
2 4 3 1 5
5
m 1 3
a 2 4 100
m 1 3
a 5 5 10
m 1 5
выходные данные
4 104 104
Задача I. Дерево интервалов с присваиванием на отрезке
Ограничение по времени, сек 2
Ограничение по памяти, мегабайт
64
Язык Free Pascal
GNU C++
Delphi Mono C#
Min время, сек 0.094 0.043 0.06 0.223
Среднее время, сек
0.139 0.199 0.167 0.237
Верных решений 6 80 7 3
Реализуйте эффективную структуру данных для хранения элементов и
присваивания нескольким подряд идущим элементам одного и того же числа.
Входные данные
В первой строке вводится одно натуральное число N (1 ≤ N ≤ 100000) — количество
чисел в массиве.
Во второй строке вводятся N чисел от 0 до 100000 — элементы массива.
В третьей строке вводится одно натуральное число M (1 ≤ M ≤ 30000) — количество
запросов.
Каждая из следующих M строк представляет собой описание запроса. Сначала
вводится одна буква, кодирующая вид запроса (g — получить текущее значение
элемента по его номеру, a — присвоить всем элементам отрезка новое значение).
Следом за g вводится одно число — номер элемента.
Следом за a вводятся три числа — левый и правый концы отрезка и число value,
которое нужно присвоить всем элементам данного отрезка массива
(0 ≤ value ≤ 100000).
Выходные данные
Выведите в одну строку через пробел ответы на каждый запрос g.
Примеры
входные данные
5
2 4 3 1 5
4
g 3
a 2 4 10
g 3
g 1
выходные данные
3 10 2
Задача J. Обратная задача для RMQ
Ограничение по времени, сек 2
Ограничение по памяти, мегабайт 64
Язык GNU C GNU C++ Delphi
Min время, сек 0.201 0.172 0.178
Среднее время, сек 0.201 0.449 0.759
Верных решений 1 23 10
Обратные задачи представляют собой быстро развивающуюся область
информатики. В отличии от классической постановки задачи, где по заданным
исходным данным D требуется решить некоторую оптимизационную задачу P, в
обратной задаче по заданной задаче P и результату вычисления R требуется
подобрать исходные данные D, на которых достигается этот результат. В этой
задаче вам предлагается решить обратную задачу к задаче о минимуме на отрезке
(range minimum query, RMQ).
Пусть задан массив a[1 n]. Ответ на запрос о минимуме на отрезке Q(i j) — это
минимальное среди значений a[i], ..., a[j]. Вам дано n и последовательность
запросов о минимуме на отрезке с ответами. Восстановите исходный массив a.
Входные данные
Первая строка входного файла содержит n — размер массива, и m — количество
запросов (1 n m 100000 ). Следующие m строк содержат по три целых числа:
числа i, j и q означают, что Q(i j)=q (1 i j n , −231 q 231−1 ).
Выходные данные
Если входные данные несовместны, то есть искомого массива a не существует,
выведите "inconsistent" на первой строке выходного файла.
В противном случае выведите “consistent” на первой строке выходного файла.
Вторая строка должна содержать сам массив. Элементы массива должны быть
целыми числами между 231 и 231−1. Если решений несколько, выведите любое.
Примечание
Баллы за эту задачу будут начислены только если решение проходит все тесты
Примеры
входные данные
3 2
1 2 1
2 3 2
выходные данные
consistent
1 2 2
входные данные
3 3
1 2 1
1 1 2
2 3 2
выходные данные
inconsistent
Задача K. Число возрастающих подпоследовательностей
Ограничение по времени, сек 0.5
Ограничение по памяти, мегабайт 64
Язык GNU C++
Min время, сек 0.064
Среднее время, сек 0.246
Верных решений 15
Задана последовательность из n чисел a1, a2, ..., an. Подпоследовательностью
длины k этой последовательности называется набор индексов i1, i2, ..., ik,
удовлетворяющий неравенствам 1 ≤ i1 < i2 < ... < ik ≤ n. Подпоследовательность
называется возрастающей, если выполняются неравенства ai1 < ai2 < ... < aik.
Необходимо найти число возрастающих подпоследовательностей наибольшей
длины заданной последовательности a1, ... ,an. Так как это число может быть
достаточно большим, необходимо найти остаток от его деления на 109 + 7.
Входные данные
Первая строка входного файла содержит целое число n (1 ≤ n ≤ 105). Вторая строка
входного файла содержит n целых чисел: a1, a2, ... ,an. Все ai не превосходят 109 по
абсолютной величине.
Выходные данные
В выходной файл выведите ответ на задачу.
Примеры
входные данные
5
1 2 3 4 5
выходные данные
1
входные данные
6
1 1 2 2 3 3
выходные данные
8
Задача L. Zeroes
Ограничение по времени, сек 1
Ограничение по памяти, мегабайт 160
Язык GNU C++
Min время, сек 0.216
Среднее время, сек 0.47
Верных решений 16
Злобный учитель в MШП любит мучить детей сложными задачками. А если дети эти
задачки не решают, учитель подвергает их самым жестоким наказаниям. На этот
раз он придумал такую задачу:
Рейтинг всех учеников МШП записан в массив A
Запросы учителя таковы:
1. Изменить рейтинг i-го ученика на число x
2. Найти максимальную последовательность подряд идущих нулей (бесперспективных
учеников) в массиве A на отрезке [l, r].
Помогите бедным ученикам МШП избежать зверского наказания за нерешение
задачи на этот раз.
Входные данные
В первой строке входного файла записано число N (1 ≤ N ≤ 500000) – количество
учеников в МШП. Во второй строке записано N чисел – их рейтинги, числа по
модулю не превосходящие 1000 (по количеству задач, которые ученик решил или
не решил за время обучения). В третьей строке записано число M (1 ≤ M ≤ 50000)
– количество запросов. Каждая из следующих M строк содержит описания
запросов:
UPDATE i x – обновить i-ый элемент массива значением x (1 ≤ i ≤ N, |x| ≤ 1000)
QUERY l r – найти длину максимальной последовательности из нулей на отрезке
с l по r. (1 ≤ l ≤ r ≤ N)
Выходные данные
В выходной файл выведите ответы на запросы QUERY в том же порядке, что и во
входном файле
Примеры
входные данные
5
328 0 0 0 0
5
QUERY 1 3
UPDATE 2 832
QUERY 3 3
QUERY 2 3
UPDATE 2 0
выходные данные
2
1
1
Задача M. Игра на бирже Ограничение по времени, сек 2
Ограничение по памяти, мегабайт 256
Петя пишет программы для бирж. Он занимается разработкой различных
финансовых инструментов, его последний проект связан с анализом возможности
арбитража с использованием исторических данных о котировках существенно
волатильной акции.
Идея анализа состоит в следующем: по заданным котировкам акции в течение n
последовательных дней, требуется выбрать подпоследовательность котировок,
которая удовлетворяет следующему свойству: любые две соседние котировки в
выбранной подпоследовательности должны отличаться не менее чем на k .
Например, если котировки равны,
соответственно, 1014, 1024, 1034, 1045, 1030, 998 и k = 15 , то
подпоследовательность котировок 1014, 1034, 998 является допустимой. Выбранная
подпоследовательность должны быть как можно длиннее. Так, в приведенном
примере выбранная последовательность не является оптимальной,
подпоследовательность 1014, 1045, 1030, 998 лучше.
По заданной последовательности котировок, найдите ее длиннейшую допустимую
подпоследовательность.
Входные данные
Первая строка входного файла содержит число n ( 1 ≤ n ≤ 100000 ) количество
котировок и k ( 1 ≤ k ≤ 10 9 ). Вторая строка содержит n целых чисел
последовательность котировок (все котировки находятся в интервале
от 1 до 10 9 включительно).
Выходные данные
Первая строка выходного файла должна содержать l — длину оптимальной
подпоследовательности. Вторая строка должна содержать l целых чисел элементы
любой такой подпоследовательности.
Примеры
входные данные
6 15
1014 1024 1034 1045 1030 998
выходные данные
4
1014 1045 1030 998