贪心10pts,hank数据通过,其余全wa 到目前为止已经卡了2h+了 没有看题解和别人的讨论思路所以有点怀疑自己方向是不是都错了……
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1010;
const int MAXM=1e4+10;
struct Passenger{
int t,a,b;
}p[MAXM];
int n,m,k,ans;
int d[MAXN];//d[i]:车站i-1,i间的行驶用时,前缀和后为离开站点i的时间点
int c[MAXN];//差分数组,还原差分数组后,c[i]表示车站i,i+1间车上的人数
int e[MAXN];//在运算加速时使用的临时数组,e[i]代表当前加速情况前离开站点i的时间点
int f[MAXN];//f[i]:到达站点i的时间点
int stops[MAXN];//每个站最晚上车的时间点
priority_queue<pair<int,int>> q;//first:区间内人数,second:区间编号 优先加速人多的区间,所以采用优先队列
void solve(){//临时求前缀和
for(int i=1;i<=n;++i){
e[i]=d[i]+e[i-1];//前缀和
e[i]=max(e[i],stops[i]);//如果到了站但是还有人没上车,等待到上车再出发
}
}
int main(){
//freopen("P1315_3.in","r",stdin);
cin>>n>>m>>k;
for(int i=2;i<=n;++i){
cin>>d[i];
}
for(int i=1;i<=m;++i){
cin>>p[i].t>>p[i].a>>p[i].b;
++c[p[i].a];
--c[p[i].b];//差分填充区间
stops[p[i].a]=max(stops[p[i].a],p[i].t);//最晚上车的
}
for(int i=1;i<n;++i){
c[i]+=c[i-1];//还原各个站点间有几个乘客坐车
q.push(make_pair(c[i],i));//存入优先队列进行排序
}
while(k&&!q.empty()){
//cout<<"加速:"<<q.top().second<<endl;
solve();
int index=q.top().second+1;
if(e[index-1]+d[index]-stops[index]<=0){//如果加速前到达下一站没有到下站最晚上车的时间,加速是没有必要的
q.pop();
continue;
}
int tmp=min(min(k,d[index]),e[index-1]+d[index]-stops[index]);//加速直到:加速机会用完/用时归零/到达下一站等于到下站最晚上车的时间(此时再加速没必要了)
k-=tmp;
d[index]-=tmp;
//cout<<"加速值:"<<tmp<<endl;
q.pop();
}
for(int i=1;i<=n;++i){
d[i]+=d[i-1];//前缀和
f[i]=d[i];
d[i]=max(d[i],stops[i]);
}
for(int i=1;i<=m;++i){
ans+=f[p[i].b]-p[i].t;
//cout<<f[p[i].b]<<' '<<p[i].t<<endl;
}
cout<<ans;
return 0;
}