自己思路是,将左端点升序排,右端点降序排,这样每次都从最大的走到最小的,是不是能找到最小值?
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int n,m;
int kk,tt=0,ll=1,rr=1;
int a[N];
int l[N],r[N];
int x[N],y[N],k[N];
int mx,my;
long long ans;
bool cmp(int a,int b){
return a>b;
}
signed main(){
memset(l,0x3f,sizeof(l));
memset(r,0x3f,sizeof(r));
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>x[i]>>y[i]>>kk;
k[x[i]]=max(k[x[i]],kk);
k[y[i]]=max(k[y[i]],kk);
}
for(int i=n-1;i>=1;i--){
r[i]=min(a[i],r[i+1]);
}
for(int i=2;i<=n;i++){
l[i]=min(a[i],l[i-1]);
}
sort(x+1,x+m+1,cmp);
sort(y+1,y+m+1);
mx=unique(x+1,x+m+1)-x-1;
my=unique(y+1,y+m+1)-y-1;
while(1){
if(k[y[ll]]<=tt){
ll++;
}
else{
k[y[ll]]-=tt;
}
if(k[x[rr]]<=tt){
rr++;
}
else{
k[x[rr]]-=tt;
}
if(ll>my||rr>mx){
break;
}
tt+=min(k[y[ll]],k[x[rr]]);
ans+=min(k[y[ll]],k[x[rr]])*(a[y[ll]]+a[x[rr]]);
// cout<<y[ll]<<" "<<k[y[ll]]<<endl<<x[rr]<<" "<<k[x[rr]]<<endl<<a[y[ll]]<<" "<<a[x[rr]]<<endl;
}
cout<<ans-a[y[1]];
return 0;
}