分析:この質問では、優先度キューを調べます。ペアタイプのデータを優先度キューに格納できます。ペアの最初の次元はタスクの終了時間であり、2番目の次元はタスクが占める計算能力です。ペアタイプは1次元でソートされ、終了時間で早いものから遅いものまでソートされるため、手書きの構造でソートする必要はなく、直接大きいものを使用できます。
この問題に対処する方法について説明します。最初にp配列を作成し、p [i]はi番目のコンピューターの現在の計算能力を記録します。現在タスクに移動する場合、このタスクはtに割り当てられます。 --thコンピューター。コンピューターの場合、最初にt番目のコンピューターの優先キューをトラバースし、終了時刻が現在時刻より前の優先キュー内のすべてのタスクを解放し、解放の過程でタスクが占める計算能力を追加します。タスク。優先キューが終了したとき現在の時刻以下の時間のすべてのタスクが解放された後、この時点でp [t]は実際にはt番目のコンピューターの計算能力を表します。このとき、 p[t]とdが判断されます。p[t]<dの場合は直接-1を出力し、p [t]> =dの場合はp[t]-dを出力し、p [t] -dを追加し、追加します。タスクをt番目のコンピューターの優先キューに入れ、タスクの終了時間はa + c-1であり、計算能力はdです。
コードは次のとおりです。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>PII;
const int N=200030;
priority_queue<PII,vector<PII>,greater<PII> >q[N];
ll p[N];//p[i]表示第i个计算机的算力
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%lld",&p[i]);
for(int i=1;i<=m;i++)
{
ll a,b,c,d;
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
while(!q[b].empty()&&q[b].top().first<a)
{
p[b]+=q[b].top().second;//把无效任务的占用的算力释放
q[b].pop();//释放无效任务
}
if(p[b]>=d)
{
p[b]-=d;
printf("%lld\n",p[b]);
q[b].push({a+c-1,d});//把当前任务加入第b个计算机的优先队列
}
else
puts("-1");
}
return 0;
}