Привет всем. Нужна ваша помощь по решению задачи (8C - Looking for Order). Спасибо за внимание.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 160 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | Dominater069 | 154 |
8 | awoo | 154 |
10 | luogu_official | 151 |
Привет всем. Нужна ваша помощь по решению задачи (8C - Looking for Order). Спасибо за внимание.
Название |
---|
Не все не читают теги))
Дам маленькую подсказку. O(N2 * 2N), но на практике всё гораздо меньше.
Можно за O(2n·n). Вообще основная стандартная идея такая. Будем делать динамику по множеству взятых объектов. Хранить множество можно в виде числа. Если представить число в двоичном виде, то можно сказать, что элементы, в разрядах которых стоят единицы, входят в множество, кодируемое данным числом.
Переход в динамике — возьмем один или два предмета. Как взять один ---понятно: переберем удаляемый элемент, посмотрим, что мы насчитали для множества, где этот элемент отсутствует и прибавим квадрат расстояния от него до сумки. Если мы хотим O(2n·n2), то с двумя можно делать примерно то же самое, перебрать их, посмотреть ответ для множества без них и прибавить расстояние, которое нужно пройти, чтобы их собрать (нужно сложить расстояние между этими предметами и расстояния от каждого предмета до сумки).
Теперь, чтобы стало O(2n·n), надо понять, что всегда нужно убирать предмет с самым маленьким номером. То есть, останется перебрать только один предмет из пары. Почему это так? Потому что порядок взятия не важен и когда-то нам в любом случае придется брать этот предмет. Если мы возьмем его сейчас, мы ничего не испортим.
Код: 2039949