#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define RG register
#define IL inline
#define pi acos(-1.0)
#define ll long long
using namespace std;
int gi() {
char ch=getchar(); int x=0;
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9') {x=10*x+ch-'0';ch=getchar();}
return x;
}
const int maxn = 1010;
const int maxm = 10010;
int n,m,k,ans;
int d[maxn];
int a[maxm],b[maxm],t[maxm];
int f[maxn],ti[maxn],last[maxn],sum[maxn];
int main() {
n=gi(),m=gi(),k=gi();
for(int i=1; i<n; i++) d[i]=gi();
for(int i=1; i<=m; i++) {
t[i]=gi(),a[i]=gi(),b[i]=gi();
last[a[i]]=max(last[a[i]],t[i]);
for(int j=b[i]; j<=n; j++) sum[j]++;//sum[j]表示在j号点及以前下车的人数
}
while(k--) {
for(int i=2; i<=n; i++) {
ti[i]=max(ti[i-1],last[i-1])+d[i-1];//ti[i]表示到i号点的时间
}//last[i]表示在人出现在i号点的最晚时间
f[n]=0;//f[i]表示在i号点使用加速所能影响到的点数(注意影响的条件)
for(int i=n-1; i>=1; i--) {
if(ti[i+1]>last[i+1]) f[i]=f[i+1]+1;
else f[i]=1;//可能有人在i+1站下车;
}
int mxp=0,mxv=-1;
for(int i=1; i<n; i++) {
if(d[i] && f[i] && sum[i+f[i]]-sum[i]>mxv) {//算i~i+f[i]下车的人数,可以享受到加速
mxv=sum[i+f[i]]-sum[i];
mxp=i;
}
}
d[mxp]--;
}
for(int i=2; i<=n; i++) ti[i]=max(ti[i-1],last[i-1])+d[i-1];
for(int i=1; i<=m; i++) ans+=ti[b[i]]-t[i];
printf("%d", ans);
return 0;
}
【NOIP2011】观光公交
最新推荐文章于 2023-04-03 17:16:42 发布