求助
查看原帖
求助
789564
queenbee楼主2024/6/22 18:37

自己思路是,将左端点升序排,右端点降序排,这样每次都从最大的走到最小的,是不是能找到最小值?

#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;
} 
2024/6/22 18:37
加载中...