Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19

Определить количество клеток, в которых убран весь мусор

10.09.2024, 16:30. Показов 3374. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Однажды, после неудачно написанного контеста на Codeforces, Михаил окончательно разочаровался в своей карьере спортивного программиста и решил устроиться на работу дворником. Однако, даже на такую должность его ждало собеседование.

В качестве собеседования Михаилу предложили очистить от мусора довольно большой двор. Для удобства представим двор как прямоугольную таблицу, состоящую из 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 тесте, кто может помочь с оптимизацией)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;
struct cell_hash {
    size_t operator()(const pair<long long, long long>& cell) const {
        return hash<long long>()(cell.first) ^ hash<long long>()(cell.second);
    }
};
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    long long n, m, k;
    cin >> n >> m >> k;
    unordered_set<pair<long long, long long>, cell_hash> vec;
    for (long long i = 0; i < k; ++i) {
        char op;
        long long val;
        cin >> op >> val;
        if (op == '+') {
            for (long long j = 1; j <= n; ++j) {
                long long i = val - j;
                if (i >= 1 && i <= m) {
                    vec.insert({j, i});
                }
            }
        } else if (op == '-') {
            for (long long j = 1; j <= n; ++j) {
                long long i = j - val;
                if (i >= 1 && i <= m) {
                    vec.insert({j, i});
                }
            }
        }
    }
    cout << vec.size() << endl;
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.09.2024, 16:30
Ответы с готовыми решениями:

Закрасить минимальное количество клеток, так, чтобы множество черных клеток стало выпуклым
Здравствуйте ! Задача: Рассмотрим бесконечный лист клетчатой бумаги. Закрасим некоторое множество клеток в черный цвет. Теперь мы...

Определить количество раскрасок полоски из N клеток
Добрый день, решаю задачку, не могу понять почему она работает, но не правильно, помогите пожалуйста разобраться! #include...

Определить количество пустых клеток, которые не бьются ни одной из фигур
В чем проблема решения? Падает на 7 тесте. Открытые тесты решает, а вот когда загружаю то где-то неправильный ответ. На шахматной...

31
31 / 20 / 12
Регистрация: 28.08.2024
Сообщений: 42
11.09.2024, 21:13
Студворк — интернет-сервис помощи студентам
aqsdds, Четные диагонали - это те, у которых сумма или разность координат четные. Четные прямые диагонали могут пересекаться только с четными обратными и наоборот. Нечетные прямые диагонали могут пересекаться только с нечетными обратными и наоборот. Точка пересечения двух диагоналей равна одной ячейке или 0 ячейкам (если они пересекаются за пределами внутреннего двора). С каждой диагональю пересекается некоторый непрерывный поддиапазон перпендикулярных диагоналей, и выше и ниже него ничего не пересекается.
Поэтому при вводе мы сохраняем диагонали в 4 массива: прямые четные, прямые нечетные, обратные четные, обратные нечетные. Мы сортируем прямые линии. Мы проходим через обратные и используем бинарный поиск, чтобы найти количество их пересечений с прямыми линиями. Ответом будет общая длина всех диагоналей за вычетом количества точек пересечения.
0
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
11.09.2024, 21:15  [ТС]
Цитата Сообщение от Whabablca Посмотреть сообщение
aqsdds, Четные диагонали - это те, у которых сумма или разность координат четные. Четные прямые диагонали могут пересекаться только с четными обратными и наоборот. Нечетные прямые диагонали могут пересекаться только с нечетными обратными и наоборот. Точка пересечения двух диагоналей равна одной ячейке или 0 ячейкам (если они пересекаются за пределами внутреннего двора). С каждой диагональю пересекается некоторый непрерывный поддиапазон перпендикулярных диагоналей, и выше и ниже него ничего не пересекается.
Поэтому при вводе мы сохраняем диагонали в 4 массива: прямые четные, прямые нечетные, обратные четные, обратные нечетные. Мы сортируем прямые линии. Мы проходим через обратные и используем бинарный поиск, чтобы найти количество их пересечений с прямыми линиями. Ответом будет общая длина всех диагоналей за вычетом количества точек пересечения.
воооот я пытался эту идею реализовать, но с математикой не очень. И я не смог формулки вывести. Интересно было бы на кодик взглянуть
0
31 / 20 / 12
Регистрация: 28.08.2024
Сообщений: 42
11.09.2024, 21:16
Artem Ka, Скинул в ЛС
0
0 / 0 / 0
Регистрация: 11.09.2024
Сообщений: 4
11.09.2024, 21:17
Whabablca, Ты что клал в 4 массива? А как ты потом в бин поиске диагонали сравнивал, по какому принципу?

Добавлено через 26 секунд
Whabablca, Мне тоже можешь пж
0
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
11.09.2024, 21:18  [ТС]
Цитата Сообщение от Whabablca Посмотреть сообщение
, Скинул в ЛС
не вижу пока ничего
0
31 / 20 / 12
Регистрация: 28.08.2024
Сообщений: 42
11.09.2024, 21:38
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#include <sstream>
 
using namespace std;
 
int n, m;
 
int diagonal_length(int d, bool is_straight) {
    if (is_straight) {
        if (d >= 0) {
            return min({n, m, n - d});
        } else {
            return min(n, m + d);
        }
    } else {
        return min(n, d - 1) - max(1, d - m) + 1;
    }
}
 
int count_intersections(int d, const vector<int>& others) {
    int left_bound = (d <= n + 1) ? d - 2 : 2 * n - d;
    int right_bound = (d <= m + 1) ? -d + 2 : -2 * m + d;
    
    auto upper = upper_bound(others.begin(), others.end(), left_bound);
 
    auto lower = lower_bound(others.begin(), others.end(), right_bound);
    
    return upper - lower;
}
 
int main() {
    cin >> n >> m;
    
    int k;
    cin >> k;
    
    set<string> ops;
    cin.ignore();
 
    for (int i = 0; i < k; ++i) {
        string op;
        getline(cin, op);
        ops.insert(op);
    }
 
    vector<int> straight_even, straight_odd, reverse_even, reverse_odd;
 
    for (const auto& op : ops) {
        stringstream ss(op);
        char sign;
        int value;
        ss >> sign >> value;
 
        if (sign == '-') {
            if (value % 2 == 0) {
                straight_even.push_back(value);
            } else {
                straight_odd.push_back(value);
            }
        } else if (sign == '+') {
            if (value % 2 == 0) {
                reverse_even.push_back(value);
            } else {
                reverse_odd.push_back(value);
            }
        }
    }
 
    sort(straight_even.begin(), straight_even.end());
    sort(straight_odd.begin(), straight_odd.end());
 
    int total_cells = 0;
    for (int d : straight_even) total_cells += diagonal_length(d, true);
    for (int d : straight_odd) total_cells += diagonal_length(d, true);
    for (int d : reverse_even) total_cells += diagonal_length(d, false);
    for (int d : reverse_odd) total_cells += diagonal_length(d, false);
 
    int intersections = 0;
    for (int d : reverse_even) intersections += count_intersections(d, straight_even);
    for (int d : reverse_odd) intersections += count_intersections(d, straight_odd);
 
    cout << max(0, total_cells - intersections) << endl;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.11.2022
Сообщений: 19
11.09.2024, 21:44  [ТС]
Цитата Сообщение от Whabablca Посмотреть сообщение
include <iostream>
#include <set>
код..
ваш код на с++ выдает неверный ответ. А насчет кода в питоне я написал в личные сообщения. Пока не могу ращобраться с функцией bisect. импортирование библиотеки не помогает
0
12.09.2024, 08:17

Не по теме:

Цитата Сообщение от Artem Ka Посмотреть сообщение
ты мой собрат по несчастью?
В чем же несчастье-то?!

0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.09.2024, 11:37
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <string>
 
int main(){
  int n,m,k,count=0;
  
  std::cin>>n>>m>>k;
  std::string s[m], a(n,'0');
  for(int i=0;i<m;i++)
       s[i]=a;
       
   char op;
   int val;
   for(int c=0;c<k;c++){
      std::cin>>op>>val;
      if(op=='+'){
          for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
              if((i+1)+(j+1)==val)s[i][j]='1';
      }  
      
      if(op=='-'){
          for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
              if((i+1)-(j+1)==val)s[i][j]='1';  
      }  
   }       
  for(int i=0;i<m;i++)    
       std::cout<<s[i]<<'\n';
       
    for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
               if(s[i][j]=='1') count++;
    std:: cout<<count;
}
0
Модератор
Эксперт С++
 Аватар для zss
13789 / 10981 / 6492
Регистрация: 18.12.2011
Сообщений: 29,281
12.09.2024, 13:44
повар1,
Цитата Сообщение от Artem Ka Посмотреть сообщение
1≤n,m≤10**9
109*109=1018 байт = 109 гбайт
как это поместить в s?
И зачем двойные циклы, если i и j связаны линейной зависимостью?
1
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.09.2024, 14:26
Цитата Сообщение от zss Посмотреть сообщение
как это поместить в s?
просто
Миниатюры
Определить количество клеток, в которых убран весь мусор  
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
12.09.2024, 14:30
zss, думаете что
Цитата Сообщение от Artem Ka Посмотреть сообщение
cin >> op >> val;
в ручную
Цитата Сообщение от Artem Ka Посмотреть сообщение
k≤300000
осилит?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2024, 14:30

Определить количество клеток шарфа которые покрашены в заданный цвет
Незаметно для друга Алиса узнала, что ему большего всего нравятся k различных цветов. Алиса приняла решение связать шарф размером n × m, в...

Определить, через сколько часов количество амеб достигнет 50 клеток?
Амеба каждые 3 часа делится на 2 клетки. Через сколько часов количество амеб достигнет 50 клеток?

Найдите максимальную красоту среди красот всех клеток и количество клеток, имеющих такую красоту
Помогите с Олимпиадой задачкой. Проходит не все тесты: Видимость звездочек (упрощенная версия) ограничение времени на тест: 1...

Определить, какое количество клеток шахматного поля не заняты и не находятся под боем
Дано шахматное поле n×n. На поле расположено m коней. Определить, какое количество клеток не заняты и не находятся под боем. Пример...

Определить, какое количество клеток шахматного поля не заняты и не находятся под боем
Дано шахматное поле n×n. На поле расположено m ладей. Определить, какое количество клеток не заняты и не находятся под боем. Мое решение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru