CF854C очереди приоритетов планирования | набор

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 в первые секунды самолета может взлетать в приоритетной очереди внутри, а затем провел минуту или провести большое всплывающее перед тем сравнивая его организовать время взлета. (Также с набором (набор используется для сортировки))

Код:

# 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 ; 
}
Очередь Приоритет
# 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 ; 
}
Задавать

 

 

рекомендация

отwww.cnblogs.com/l999q/p/11333066.html