→ Первое занятие (06.09.2010)
Первый контест
Первый контест = 100906_30. Его нужно решить! ;-)
Условия задач (pdf)
Домашние теор-задачи:
- Дан квадрат NxN из 0 и 1, за O(N^3) нужно найти максимальный по площади подпрямоугольник состоящий только из нулей.
Эту задачу можно сдать в контест 100906_30.
- Дана реккурентная последовательность, какждый следующий элемент за O(1) выражается через 2 предыдущих.
(x[n] = F(x[n-1],x[n-2]). Нужно за O(P+T) найти P и T. Где P – длина предпериода, а T – длина периода.
Эту задачу можно сдать на acm.timus.ru (1175).
- Дан неориентированный граф. Поступают операции вида AddEdge, DelEdge, IsConnected. Нужно все операции уметь
выполнять за O(V), где V – число вершин в графе.
Усложнение домашних теор-задач:
- За O(N^2).
- Используя O(1) памяти.
- AddEdge и DelEdge нужно делать за O(1).
Замечание: Во всех задачах важно придумать решение, которое максимально просто пишется (программируется).
→ Второе занятие (13.09.2010)
Задачи на if и цикл for
- Дано N <= 10^9, нужно найти все пары a, b: a^2 + b^2 == N.
а) За O(N)
б) За O(sqrt(N))
в) Без использование функции sqrt
г) Использую только + и -
д) N == a^2 - b^2 (можно в стиле (в), не нужно (г))
- Дано N <= 10^7. Найти и вывести все простые от 1 до N.
а) Написать
б) Понять, почему можно писать i*i <= n и j = i*i, а так же, почему NloglogN.
- Даны N, K.
У вас есть поле NxN и K ферзей на нем.
Координаты ферзей даны.
Выведите матрицу NxN - какие клетки биты, а какие нет.
а) За N^2*K
б) За N^2 + NK
в) За N^2 + K
→ Третье занятие (16.09.2010, четверг)
Help по функциям ввода-вывода на C/C++
- putc (link) /
getc (link)
Example, 01-gets-puts.cpp: (link)
- puts (link) /
gets (link)
Example, 02-putc-getc.cpp: (link)
- printf (link) /
scanf (link)
Example, 03-scanf-printf.cpp: (link)
- cin / cout
- sscanf (link)
Задачи на ввод и вывод
- Считать 2 числа, сложить их. Числа целые, до 100.
-
Считать N и N чисел. Вывести их в обратном порядке. На одной строке через пробел.
На конце строки не должно быть пробела. А вот перевод строки должен быть.
- Проверить, является ли файл пустым (0 байт)
- Посчитать длину файла в символах (в байтах пока что не получится).
- Посчитать число строк в файле.
- Для каждого символа от 0 до 255, посчитать, сколько раз он встречается в файле.
- Найти минимальное число в файле. Числа вещественные. Чотя бы одно число в файле точно есть.
- В каждой строке или 1, или 2 числа. Для каждой строки вывести "сколько чисел в строке".
- Посчитать сумму чисел во всем файле (все числа целые, пробелы повсюду)
а) Сумма до 109 по модулю
б) Числа до 109 по модулю
в) Числа до 1018 по модулю
-
Распарсить запросы удаления-добавления ребер.
Проверить корректность (нет мультиребер, если мы пытаемся удалить ребро, оно уже есть)
Число вершин = 5000.
+ 1 2
+ 3 4
- 2 1
- 4 3
- В каждой строке посчитать сумму чисел
а) Разделены пробелом, оканчиваются переводом строки.
б) Пробелы повсюду.
-
Считать все строки. Во всех строках поменять порядок слов на обратный.
Строка = слова, разделенные ровно одним пробелом. Ведущих и коцевых пробелов нет.
Домашние теор-задачи:
- Научитьcя число N раскладывать на множители быстрее, чем O(sqrt(N))
- В графе найти самый короткий путь четной длины между A и B.
- Научиться считать число различных подстрок строки за O(N3)
- Найти минимальное натуральное число, у которого ровно K делителей. K до 1000.
- Найти перестановку длины N, у которой ровно K инверсий
Усложнение домашних теор-задач:
- А за O(N1/4)
- А если нужно найти простой путь?
- А за O(N2)?
- Она и так сложная :)
→ Четвертое занятие (20.09.2010, понедльник)
Логины (link)
Контест = 100920_30. Удачи! ;-)
Условия контеста (link)
Подсказка :-) (link)
STL-Heap (link)
Operator меньше (link)
freopen (link)
arrays (link)
functions (link)
strings (link)
Операторы +, -, *, % в C++ (link)
→ Пятое занятие (23.09.2010, четверг)
Про C++
Конспект лекции
Упражнения на тему
- Получение цифр числа (Вывести цифры числа через пробел)
- Квадрат 1:
2 11 19
3 13 23
5 17 29
- Квадрат 2:
1 2 4 7
3 5 8 11
6 9 12 14
10 13 15 16
- Все буквы строки сделать маленькими
- Отсортировать строки (без функций работы со строками!)
Задачи с тимуса на все подряд
- 1563 - про число различных строк (link)
- 1515 - мин.достоинство монеты (link)
- 1551 - про турнир сумо (link)
- 1579 - про шубы и жадность (link)
- 1574 - про скобки (число правильных циклических сдвигов) (link)
Далее сложные задачи для тех, кто сделал все простые
- 1508 - Динамика про японский кроссворд (link)
Домашние теор-задачи:
- Научитьcя расставлять на доске NxN N ферзей так, чтобы они не били друг друга. N до 104
- Boxes из ЛКШ, А0-2010 (или B-2009)
Есть люди, у них есть сила и вес.
Нужно построить максимально высокую башню.
Такую, что сила каждого в башне >= сумме масс, тех кто стоит на нем.
→ Шестое занятие (27.09.2010, понедельник)
Про C++
(1) Функции работы со строками и с памятью
memset(a, 0, sizeof(a))
memcpy(a, b, sizeof(a))
strcpy(a, b)
strcmp(a, b) // return < 0, = 0, > 0
strchr(s, '*') - s
strstr(s, "cat") - s
(2) Упражнения:
а) Найти подстроку в тексте за O(mn)
б) Разделить строку на две звездочкой. Вывести две половинки. Каждую на отдельной строке. Пример: ab*cd → ab \n cd
в) Отсортировать строки, попытка 2.
Разные задачи на строки
- Timus 1723 (Халява?)
- Timus 1089 (Исправление текста по словарю)
- Timus 1067 (Дерево Директорий)
- Timus 1297 (Max подпалиндром за O(N^2))
Про строки и хэши
- Полиномиальный хэш
- Оценка вероятности N2/264
- Хэш на подотрезкe = разница хэшей на префиксах
- Пересчет хэша на подотрезке длины L за O(1)
Сложные задачи на строки и хэши
- Поиск строки в тексте за O(N+M)
- Наибольшая общая подстрока O(NlogN) Timus 1517
- Наибольший подпалиндром за O(N) Timus 1297
- Подматрица в матрице (+ бинпоиск) Timus 1486
Контест
Контест = 100927_30. Решаем, в особенности то, что про строки.
Условия задач (pdf)
→ Седьмое занятие (30.09.2010, четверг)
Про C++
if (x > 0) a; else b; <=> x ? a : b;
(a += b) <=> (a = a + b)
if (x > 0) <=> if (x)
if (x > 0) a = 2, b = 3; else a = 3, b = 2; // "," => Можно не ставить скобки
(1) Лекция по хэшам (продолжение)
Хэш-таблица.
→ 8-е занятие (04.10.2010, понедельник
Z
Prefix
Вариация на тему "число различных подстрок"
→ 9-е занятие (07.10.2010, четверг)
Логины (link)
Контест = 101007_30. Удачи! ;-)
Условия контеста (link)
Решения:
→ 10-е занятие (11.10.2010, понедельник)
Порядок решения задач: G → C → D → F
Особо продвинутым: 1256 с тимуса и задачу про K-подмножество с max средней стоимостью.
Контест = 101008b2. Удачи! ;-)
Условия контеста (link)
→ 11-е занятие (14.10.2010, четверг)
Далее про строчки.
А еще про STL (sort, lower_bound)
[ПЛАН]
→ 12-е и 13-е занятия (18.10.2010, 21.10.2010)
→ 14-е занятие (25.10.2010, понедельник)
Тренировка перед командной городской
Логины (link)
Контест = 101025_30. Удачи! ;-)
Условия контеста (link)
→ 15-е занятие (28.10.2010, четверг)
Контест = 101028_30. Удачи! ;-) [Логины]
Примеры со (struct) и (operator +) [link]
→ 16-е занятие (01.11.2010, понедельник)
Геометрия, Level 1: [условия]
Можно сдавать задачи сюда Контест = 101028_30. Удачи! ;-) [Логины]
→ 17-е занятие (08.11.2010, понедельник)
Открыто дорешивание городской олимпиады!
Логины (link)
Контест = 101103a1. Удачи! ;-)
Условия контеста (link)
Нужно порешать задачи по геометрии (про выпуклую оболочку)
У нас новая тема: Приближенные вычисления в геометрии. [ПЛАН]
→ 18-е занятие (11.11.2010, четвег)
Главная тема --- Приближенные вычисления
Сегодня всем нужно ХОТЯ БЫ закончить с полосками и Монте-Карло.
Не забудьте, остаются задачи про выпуклую оболочку, точку внутри многоугольника, касательные к окружностям
А еще можно дорешивать командный город.
→ 19-е занятие (15.11.2010, понедельник, параллельно со сборами)
Дорешиваем, дорешиваем и еще раз дорешиваем.
Дорешали? Есть новый контест: Контест = 101115o. Удачи! ;-) Условия контеста (link)
Есть задача на "подумать": [timus:1103]. Если она кажется вам слишком простой, придумайте решение за O(n).
→ 20-е занятие (18.11.2010, четверг, параллельно со сборами)
Занятие от Коли Карпова
Отмечаем юбилей: "20 занятий". Дорешиваем.
→ 21-е занятие (22.11.2010, понедельник)
17:00 - Не пропустите! начало чего-то нового!
Перебор
Перебор.Теория.
- Полный перебор
- Отсечение по ответу: if (dep >= answer) return
- Отсечение по ответу с оценкой на остаток if (dep + F >= answer) return
- Отсечение "Динамика". if (мы уже были в этом состоянии) return
- Внешний перебор ответа.
- ищем путь минимальной длины = MinLen. Можно перебрать все пути, а можно только длины MinLen
- Для этого перебираем во внешнем цикле MinLen (т.е. ответ на задачу)
- Отсечение по времени =)
Перебор.Практика.
- Рекурсия на примере задачи про различные пути. [statement, problem A]
- Задача timus : 1152 (Зеркала). Отсечение по ответу.
- Задача про самый длинный простой путь [statement, problem B]
- Задача про StringDecomposition [statement, problem C]
Куда сдавать задачи?
- 1152 - на acm.timus.ru
- Все остальные в контест 101125_30 [statements]
- Пожалуйста, решайте задачи по порядку!
Язык Си
- clock(), CLOCKS_PER_SEC
- time(NULL)