Helen works in Metropolis airport. She is responsible for creating a departure schedule. There are n flights that must depart today, the i-th of them is planned to depart at the i-th minute of the day.
Metropolis airport is the main transport hub of Metropolia, so it is difficult to keep the schedule intact. This is exactly the case today: because of technical issues, no flights were able to depart during the first k minutes of the day, so now the new departure schedule must be created.
All n scheduled flights must now depart at different minutes between (k + 1)-th and (k + n)-th, inclusive. However, it's not mandatory for the flights to depart in the same order they were initially scheduled to do so — their order in the new schedule can be different. There is only one restriction: no flight is allowed to depart earlier than it was supposed to depart in the initial schedule.
Helen knows that each minute of delay of the i-th flight costs airport ci burles. Help her find the order for flights to depart in the new schedule that minimizes the total cost for the airport.
The first line contains two integers n and k (1 ≤ k ≤ n ≤ 300 000), here n is the number of flights, and k is the number of minutes in the beginning of the day that the flights did not depart.
The second line contains n integers c1, c2, ..., cn (1 ≤ ci ≤ 107), here ci is the cost of delaying the i-th flight for one minute.
The first line must contain the minimum possible total cost of delaying the flights.
The second line must contain n different integers t1, t2, ..., tn (k + 1 ≤ ti ≤ k + n), here ti is the minute when the i-th flight must depart. If there are several optimal schedules, print any of them.
5 2
4 2 1 10 2
20
3 6 7 4 5
Let us consider sample test. If Helen just moves all flights 2 minutes later preserving the order, the total cost of delaying the flights would be (3 - 1)·4 + (4 - 2)·2 + (5 - 3)·1 + (6 - 4)·10 + (7 - 5)·2 = 38 burles.
However, the better schedule is shown in the sample answer, its cost is (3 - 1)·4 + (6 - 2)·2 + (7 - 3)·1 + (4 - 4)·10 + (5 - 5)·2 = 20burles.
新號第一次打cf,由於STL不熟練,手寫優先隊列寫掛了,止步c題,還需努力.
題意:本來安排了n架飛機,每架飛機有mi的重要度,第i架飛機的起飛時間原定為i,而現在在k時之前不能有任何飛機起飛,每個時間點只有1架飛機能起飛,損失被定義為(飛機現起飛時間-飛機原起飛時間)*該飛機的重要度.現在要求你排一張時間表,要求每架飛機都只能在原起飛時間及以后起飛,且使損失最小.
題解:顯然是一道貪心,值越大的越先起飛,造成損失越小,因為假設a>b , a*n+b*(n+1)=(a+b)*n+b (1) , a*(n+1)+b*n=(a+b)*n+a (2).顯然(1)>(2).所以枚舉時間,將1-k之間的飛機先壓入優先隊列,接着k-n+k一邊加進原定當時起飛的飛機,一邊找到優先隊列中的最大值即隊頂元素,將它放在該位置,更新它的新的起飛時間.這樣可以保證i時進來的飛機一定在i之后起飛.
代碼如下:
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define N 300010 using namespace std; struct NODE { int i,w; bool operator <(const NODE&a)const { return w<a.w; } }p[N]; int main() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&p[i].w); p[i].i=i; } priority_queue<NODE>q; for(int i=1;i<=k;i++) { q.push(p[i]); } long long sum=0; for(int i=k+1;i<=n+k;i++) { if(i<=n) { q.push(p[i]); } NODE now=q.top(); q.pop(); sum+=(long long) (i-now.i)*now.w; p[now.i].i=i; } printf("%lld\n",sum); for(int i=1;i<=n;i++) { printf("%d ",p[i].i); } return 0; }
每天刷題,身體棒棒!
