Есть
абстрактных ресурсов, пронумерованные целыми числами от
до
. Каждый ресурс в конкретный момент времени может находиться либо в занятом, либо в свободном состоянии. Изначально (в момент времени
) все ресурсы находятся в свободном состоянии.
Блокировка с порядковым номером
представляет из себя четверку чисел (
), обозначающих соответственно время старта (
), левую и правую границы индексов ресурсов (
), продолжительность (
) блокировки.
Блокировка
называется принятой, если на момент времени
все ресурсы с индексами в диапазоне
находятся в свободном состоянии. Принятая блокировка
переводит все ресурсы с индексами в диапазоне
в занятое состояние для всех моментов времени в диапазоне
.
Необходимо реализовать алгоритм, реализующий данную логику.
Формат входных данныхВ первой строке входных данных записано два числа —
, разделенных одним пробелом.
В последующих
строках задано описание блокировок в примере Васи. В
-й из этих строк записано четыре числа —
, разделенных одним пробелом.
Гарантируется, что все
различны.Блокировки следуют в порядке возрастания величины
.
Формат выходных данныхВ
-й строке выходных данных необходимо вывести результат обработки
-й блокировки в порядке следования во входных данных: если
-я блокировка является принятой, вывести
Yes, иначе
No.
Мое решение:
Код:
#include <iostream>
#include <vector>
using namespace std;
struct block {
int start, end, time;
};
int clear (int time, vector<block> *blocked) { // clear outdated blocks
for (auto it = blocked->cbegin(); it != blocked->cend(); ++it) {
if (it->time <= time) {
blocked->erase(it);
return 1;
}
}
return 0;
}
int intersects(vector<block>::const_iterator it, int start, int end) {
if ((start <= it->start && it->start <= end) ||
(start <= it->end && it->end <= end)) {
return 1;
}
return 0;
}
int block_me(vector<block> *blocked, int time, int start, int end, int duration) {
while (clear(time, blocked) == 1);
for (auto it = blocked->cbegin(); it != blocked->cend(); ++it) {
if (intersects(it, start, end) == 1) {
cout << "No";
return 1;
}
}
block t = {
.start = start,
.end = end,
.time = time + duration
};
blocked->push_back(t);
cout << "Yes";
return 0;
}
int main() {
int n, m;
cin >> n >> m;
vector<block> blocked;
for (int i = 0; i < m; ++i) {
int s, l, r, d;
cin >> s >> l >> r >> d;
block_me(&blocked, s, l, r, d);
cout << endl;
}
return 0;
}
Решение проверяется системой yandex contest. На седьмом тесте мой код выдает неверный ответ. Никак не могу понять, что я упустил?