이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "robots.h".
//#include "grader.h"
using namespace std;
#define ll long long
#define F first
#define S second
mt19937 rnd(100);
int putaway(int N, int M, int K, int X0[], int Y0[], int PX[], int PY[]) {
multiset<int> X, Y;
for (int i = 0; i < N; i++)
X.insert(X0[i] - 1);
for (int i = 0; i < M; i++)
Y.insert(Y0[i] - 1);
for (int i = 0; i < K; i++)
if (X.lower_bound(PX[i]) == X.end() && Y.lower_bound(PY[i]) == Y.end())
return -1;
map<int, multiset<pair<int, int>>*> ver, hor;
for (int i = 0; i < K; i++)
{
int h = *X.lower_bound(PX[i]);
if (!ver.count(h))
ver[h] = new multiset<pair<int, int>>;
ver[h]->insert({PY[i], PX[i]});
h = *Y.lower_bound(PY[i]);
if (!hor.count(h))
hor[h] = new multiset<pair<int, int>>;
hor[h]->insert({PX[i], PY[i]});
}
int ans = 0;
while (K) {
int bad = -1;
for (int x : X) { // Перебираем вертикальную прямую.
auto p0 = ver.upper_bound(x);
if (p0 == ver.begin()) {
bad = x;
continue;
}
--p0;
pair<int, int> p = *prev(p0->S->end()); // Удаляемая пара (y x)
p0->S->erase(p0->S->find(p));
if (p0->S->empty())
ver.erase(p0);
int h = *Y.lower_bound(p.F);
if (!hor.count(h))
hor[h] = new multiset<pair<int, int>>;
hor[h]->erase(hor[h]->find({p.S, p.F}));
if (hor[h]->empty())
hor.erase(h);
K--;
}
while (!X.empty() && *X.begin() <= bad)
X.erase(X.begin());
bad = -1;
for (int y : Y) {
auto p0 = hor.upper_bound(y);
if (p0 == hor.begin()) {
bad = y;
continue;
}
--p0;
pair<int, int> p = *prev(p0->S->end()); // Удаляемая пара (x y)
p0->S->erase(p0->S->find(p));
if (p0->S->empty())
hor.erase(p0);
int h = *X.lower_bound(p.F);
if (!ver.count(h))
ver[h] = new multiset<pair<int, int>>;
ver[h]->erase(ver[h]->find({p.S, p.F}));
if (ver[h]->empty())
ver.erase(h);
K--;
}
while (!Y.empty() && *Y.begin() <= bad)
Y.erase(Y.begin());
ans++;
}
return ans;
}
/*int main()
{
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
int N, M, K;
cin >> N >> M >> K;
int X[N], Y[M], PX[K], PY[K];
for (int &i : X)
cin >> i;
for (int &i : Y)
cin >> i;
for (int i = 0; i < K; i++)
cin >> PX[i] >> PY[i];
cout << putaway(N, M, K, X, Y, PX, PY);
}*/
/*
3 2 10
6 2 9
4 7
4 6
8 5
2 3
7 9
1 8
5 1
3 3
8 7
7 6
10 5
2 1 3
2 5
3
3 1
5 3
2 2
1 1 3
100
100
1 1
1 1
1 1
*/
/*
*/
/*
Ох. Я конечно стер предыдущие большие мысли, но все еще выглядит как жадник.
Для каждой вертикальной прямой есть элементы которые находятся в самом правом доступном для этой прямой столбце.
Из них мы берем максимальный по другому параметру элемент.
Правда ли это? Подумаю над контр тестом.
Ладно. Можно сначала в тупую написать.
Можно максимально в тупую. Нужно идею проверить.
Для каждой точки найдем первую прямую справа.
Разделим точки по признаку такой прямой.
При обработке удаления от прямой, мы берем множество для самой правой из прямых левее и удаляем максимальную по второй координате точку оттуда.
Вопрос появился.
Важно ли для прямых одного типа то, как по ним проходиться?
Ну, вдруг да, будем проходиться снизу вверх.
Опа. Идея сработала.
Осталось оптимизировать.
Такс. У меня тлится на тестах с N == 2.
Не думаю что мое решение настолько плохое.
Ну, наверное подберу тест.
(А, наверное повторение точек все ломает)
*/
/*
*/
/*
*/
/*
*/
/*
10 _ _ | _ _ _ _ | _ _ _ | _
9 _ _ | _ _ _ _ | 3 _ _ | _
8 4 _ | _ _ _ _ | _ _ _ | _
---------------------------------------
7 _ _ | _ _ _ _ | _ 7 _ | _
6 _ _ | _ 0 _ _ | 8 _ _ | _
5 _ _ | _ _ _ _ | _ 1 _ | 9
---------------------------------------
4 _ _ | _ _ _ _ | _ _ _ | _
3 _ 2 | 6 _ _ _ | _ _ _ | _
2 _ _ | _ _ _ _ | _ _ _ | _
1 _ _ | _ _ 5 _ | _ _ _ | _
1 2 3 4 5 6 7 8 9 10
10 _ _ | _ _ _ _ | _ _ _ | _
9 _ _ | _ _ _ _ | _ _ _ | _
8 _ _ | _ _ _ _ | _ _ _ | _
---------------------------------------
7 _ _ | _ _ _ _ | _ 7 _ | _
6 _ _ | _ _ _ _ | 8 _ _ | _
5 _ _ | _ _ _ _ | _ 1 _ | _
---------------------------------------
4 _ _ | _ _ _ _ | _ _ _ | _
3 _ 2 | _ _ _ _ | _ _ _ | _
2 _ _ | _ _ _ _ | _ _ _ | _
1 _ _ | _ _ 5 _ | _ _ _ | _
1 2 3 4 5 6 7 8 9 10
10 _ _ | _ _ _ _ | _ _ _ | _
9 _ _ | _ _ _ _ | _ _ _ | _
8 _ _ | _ _ _ _ | _ _ _ | _
---------------------------------------
7 _ _ | _ _ _ _ | _ _ _ | _
6 _ _ | _ _ _ _ | _ _ _ | _
5 _ _ | _ _ _ _ | _ 1 _ | _
---------------------------------------
4 _ _ | _ _ _ _ | _ _ _ | _
3 _ _ | _ _ _ _ | _ _ _ | _
2 _ _ | _ _ _ _ | _ _ _ | _
1 _ _ | _ _ _ _ | _ _ _ | _
1 2 3 4 5 6 7 8 9 10
*/
컴파일 시 표준 에러 (stderr) 메시지
robots.cpp:2:20: warning: extra tokens at end of #include directive
2 | #include "robots.h".
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |