#include
#include
#include
long long calc(int n, int m, const std::vector& dVector, std::vector& sVector) {
std::sort(sVector.begin(), sVector.end());
long long cells = 0;
for (auto s : sVector)
cells += s - 1 - std::max(s - 1 - n, 0) - std::max(s - 1 - m, 0);
for (auto d : dVector) {
const auto dLength = d >= 0 ? std::min(n - d, m) : std::min(n, m + d);
d = std::abs(d);
const auto low = std::upper_bound(sVector.cbegin(), sVector.cend(), d);
const auto high = std::upper_bound(low, sVector.cend(), d + 2 * dLength);
cells += dLength - (high - low);
}
return cells;
}
int main() {
int n, m, k;
std::cin >> n >> m >> k;
std::vector sOdds, sEvens, dOdds, dEvens;
for (int i = 0; i < k; ++i) {
char op;
int val;
std::cin >> op >> val;
if (op == '+')
(val & 1 ? sOdds : sEvens).emplace_back(val);
else
(val & 1 ? dOdds : dEvens).emplace_back(val);
}
std::cout << calc(n, m, dOdds, sOdds) + calc(n, m, dEvens, sEvens);
return 0;
}
В качестве собеседования Михаилу предложили очистить от мусора довольно большой двор. Для удобства представим двор как прямоугольную таблицу, состоящую из n строк и m столбцов. Строки пронумерованы сверху вниз числами от 1 до n, а столбцы — слева направо числами от 1 до m. На пересечении i-й строки и j-го столбца находится клетка с координатами (i,j).Изначально в каждой клетке двора лежит огромная куча мусора. Михаил в рамках своего собеседования произвел k
операций, каждая из которых была одного из двух типов:
Убрать весь мусор во всех клетках
(i,j), таких что i+j=s;
Убрать весь мусор во всех клетках (i,j), таких что i−j=d.
Ваша задача — определить количество клеток, в которых Михаил убрал весь мусор.
Формат входных данных
Первая строка содержит два целых числа n и m (1≤n,m≤10**9) — размеры двора. Вторая строка содержит одно целое число k(0≤k≤300000) — количество операций, совершенных Михаилом.
Каждая из следующих k строк содержит описание очередной операции, совершенной Михаилом в следующем формате:
+ s (2≤s≤n+m) — данная операция означает, что Михаил убрал весь мусор во всех клетках (i,j), таких что i+j=s;
- d(1−m≤d≤n−1)— данная операция означает, что Михаил убрал весь мусор во всех клетках (i,j), таких что i−j=d.
Формат выходных данных
Выведите одно целое число — количество клеток, в которых Михаил убрал весь мусор.
Примеры
Входные данные
4 4
4
+ 4
+ 2
- 0
- -3
Выходные данные
7
Примечания
Рассмотрим действия Михаила в примере из условия:
Михаил убирает мусор из клеток (i,j), для которых i+j=4. Это клетки с координатами (1,3), (2,2) и (3,1).
Михаил убирает мусор из клеток (i,j), для которых i+j=2. Это клетка с координатами (1,1).
Михаил убирает мусор из клеток (i,j), для которых i−j=0. Это клетки с координатами (1,1), (2,2), (3,3) и (4,4).
Михаил убирает мусор из клеток (i,j), для которых i−j=−3. Это клетка с координатами (1,4).
Таким образом, мусор был убран из клеток (1,1), (1,3), (1,4), (2,2), (3,1), (3,3) и (4,4).
Написал код на с++, но он падает по времени на 17 тесте, кто может помочь с оптимизацией, либо другим оптимальным решением на любом языке)