题目详情 - I.负载均衡 - 追梦算法网 (mangata.ltd)
除代码中注释,还有要总结的:
1.若一个状态只受前面的状态影响而与后面状态无关,则含有这种状态的题目可以边输入边输出;
2.想到了暴力的循环就写,总能蹭点分,说不定还就对了。
代码:
#include<iostream>
#include<queue>
#include<utility>//pair头文件
#define pii pair<int,int>//创建pair类型的队列用define更方便;pair类型相当于可以比较大小的结构体
using namespace std;
priority_queue<pii,vector<pii>,greater<pii> >que[200000];/*若要队列填写第三个参数则第二个参数也必须写上,greater<T>表示小顶堆,即每次取出并删除最小值;还有,可以创建队列数列*/
int main()
{
int a,b,c,d,n,m,v[200000],t,r;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>v[i];
for(int i=0;i<m;i++)//遍历所有时刻
{
cin>>a>>b>>c>>d;
while(!que[b].empty())
{
t=que[b].top().first;//恢复时刻
r=que[b].top().second;//对应回复算力
if(t>a)
break;//若最小时刻都大于a
v[b]+=r;
que[b].pop();//删除
}
if(v[b]-d<0)
cout<<-1<<endl;
else
{
v[b]-=d;
que[b].push({a+c,d});//插入
cout<<v[b]<<endl;
}
}
return 0;
}