C. Планирование
Хелен работает в аэропорту Метрополис. Она отвечает за создание расписания вылета. Есть ˝n˝ рейсы , которые должны вылетают сегодня, я -м из них планируется отойти на я -му минуту дня.
Аэропорт Metropolis является главным транспортным узлом митрополии, так что трудно сохранить график нетронутым. Это именно тот случай сегодня: из - за технических проблем, никаких полетов не смогли вылететь в течение первых K минут в день, так что теперь новый график вылета должен быть создан.
Все ˝n˝ регулярные рейсы должны теперь отправляются в разные минуты между ( K + 1) -го и ( к + п ) -й включительно. Тем не менее, это не является обязательным для полетов отбыть в том же порядке , как они были первоначально планировалось сделать это - их порядок в новом графике может быть различным. Существует только одно ограничение: полет не разрешается уходить раньше , чем предполагалось отойти в первоначальном графике.
Элен знает , что каждая минута задержки я полет -го стоит аэропорта с я burles. Помогите ей найти заказ на рейсы отбыть в новом графике , что сводит к минимуму общей стоимости для аэропорта.
Первая строка содержит два целых чисел п и K ( 1 ≤ K ≤ п ≤ 300 000), здесь п является количеством рейсов, а к этому количество минут в начале дня , что полеты не отходили.
Вторая строка содержит п целых числа гр 1, гр 2, ..., C п ( 1 ≤ C я ≤ 10 7), здесь с я являюсь стоимостью задержки я ий полета в течение одной минуты.
Первая строка должна содержать минимально возможную общую стоимость задержки полетов.
Вторая строка должна содержать п различных целых чисел т 1, т 2, ..., т п ( к + 1 ≤ т я ≤ K + N ), здесь т I это минута , когда я -м полет должен отходить. Если существует несколько оптимальных графиков, выведите любой из них.
5 2
4 2 1 10 2
20
3 6 7 4 5
Рассмотрим образец теста. Если Хелен просто перемещает все рейсы через 2 минуты с сохранением порядка, общая стоимость задержки полетов будет (3 - 1) · 4 + (4 - 2) · 2 + (5 - 3) · 1 + (6 - 4 ) · 10 + (7 - 5) · 2 = 38 burles.
Тем не менее, тем лучше график показан на образце ответа, его стоимость (3 - 1) · 4 + (6 - 2) · 2 + (7 - 3) · 1 + (4 - 4) · 10 + (5 - 5) · 2 = 20burles.
Значение вопросов: Есть ˝n˝ самолеты, их первоначальное время вылета, а затем 1 ~ п, к минут раньше, но не может взлететь, первые известные задержки самолетов на 1мин я провести в ХИ, и не может взлететь раньше запланированного попросили каждого кадра в первом самолете взлетел, чтобы провести по крайней мере несколько минут.
Решение: потому что они не могут снять раньше, чем планировалось, мы первые к + I в первые секунды самолета может взлетать в приоритетной очереди внутри, а затем провел минуту или провести большое всплывающее перед тем сравнивая его организовать время взлета. (Также с набором (набор используется для сортировки))
Код:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# include <. бит / STDC ++ H> #define будет долго долго с помощью пространства имен STD; Const INT N = 3e5 + 10 ; структура узла { INT идентификатор, с; BOOL оператор <( Const узел & х) сопзЬ { если (с == хс) возвращение идентификатор < x.id; вернуться с < хс; } } А [Н], х; INT ANS [N]; INT основных () { INT п, к; зсапЕ ( " % d% d " , & п, &к); для ( INT I = 1 ; г <= п; я ++ ) { Scanf ( " % D " , & [я] .c); а [я] .id = я; } LL сумма = 0 ; priority_queue <узел> д; для ( INT I = 1 ; г <= к; я ++ ) q.push (а [I]); для ( INT I = к + 1 ; г <= к + п; я ++ ) { если (я <= п) q.push (а [I]); х =q.top (); q.pop (); сумма + = 1LL * (ix.id) * хс; ANS [x.id] = I; } Е ( " % LLD \ п " , сумма); для ( INT I = 1 ; г <= п; я ++ ) Е ( " % d% С " , ANS [I], я == п? ' \ п ' : ' ' ); вернуться 0 ; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# include <. бит / STDC ++ H> #define будет долго долго с помощью пространства имен STD; Const INT N = 3e5 + 10 ; структура узла { INT идентификатор, с; } а [Н], х; BOOL CMP (узел я, узел к) { если (IC == х) возвращают i.id> j.id; вернуться Ic> JC; } INT ANS [N]; набор < INT > s; INT основных () { INT п, к; зсапЕ ( " % d% d " , & п, & к); для ( INT I = 1 ; г <= п; я ++ ) { Scanf ( " % D " , & [я] .c); а [я] .id = я; s.insert (я + к); } Рода (а + 1 , а + п + 1 , CMP); LL сумма = 0 ; для ( INT I = 1 ; г <= п; я ++ ) { INT х = * s.lower_bound (а [я] .id); сумма + = 1LL * (ха [я] .id) * а [я] .c; ANS [а [я] .id]= Х; s.erase (х); } Е ( " % LLD \ п " , сумма); для ( INT I = 1 ; г <= п; я ++ ) Е ( " % d% С " , ANS [I], я == п? ' \ п ' : ' ' ); вернуться 0 ; }