求助RE
查看原帖
求助RE
489725
方块鼠楼主2024/10/4 18:56
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,T;
//-2 wait -1 none 0 white 1 black
struct spot{
	int x,y;
};
int colored=0;
struct edge{
	spot u,v;
	int w;
}ed[10000010];
int get_;
int k;
int sp[2000][2000];
long long min_(long long a,long long b){
	if(a<=b){
		return a;
	}else{
		return b;
	}
}
bool cmp(edge a,edge b){
	return a.w>b.w;
}
int main(){
	freopen("traffic2.in","r",stdin);
	freopen("traffic.out","w",stdout);
	cin>>n>>m>>T;
	for(int i=1;i<=n-1;i++){
		for(int j=1;j<=m;j++){
			spot u,v;
			u.x=i;
			u.y=j;
			sp[i][j]=-1;
			v.x=i+1;
			v.y=j;
			sp[i+1][j]=-1;
			ed[++get_].u=u;
			ed[get_].v=v;
			cin>>ed[get_].w;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m-1;j++){
			spot u,v;
			u.x=i;
			u.y=j;
			sp[i][j]=-1;
			v.x=i;
			v.y=j+1;
			sp[i][j+1]=-1;
			ed[++get_].u=u;
			ed[get_].v=v;
			cin>>ed[get_].w;
		}
	}
	int ori_get_=get_;
	while(T--){
		colored=0;
		get_=ori_get_;
		cin>>k;
		int x3,p,t;
		for(int i=1;i<=k;i++){
			cin>>x3>>p>>t;
			if(p<=m){
				spot u,v;
				u.x=0;
				u.y=p;
				sp[0][p]=t;
				v.x=1;
				v.y=p;
				sp[1][p]=-1;
				ed[++get_].u=u;
				ed[get_].v=v;
				ed[get_].w=x3;
			}else if(p>=m+1&&p<=m+n){
				spot u,v;
				u.x=(p-m);
				u.y=m+1;
				sp[p-m][m+1]=t;
				v.x=(p-m);
				v.y=m;
				sp[p-m][m]=-1;
				ed[++get_].u=u;
				ed[get_].v=v;
				ed[get_].w=x3;
			}else if(p>=m+n+1&&p<=2*m+n){
				spot u,v;
				u.x=n+1;
				u.y=(2*m+n-p+1);
				sp[n+1][2*m+n-p+1]=t;
				v.x=n;
				v.y=(2*m+n-p+1);
				sp[n][2*m+n-p+1]=-1;
				ed[++get_].u=u;
				ed[get_].v=v;
				ed[get_].w=x3;
			}else if(p>=2*m+n+1&&p<=2*m+2*n){
				spot u,v;
				u.x=(2*m+2*n+1-p);
				u.y=0;
				sp[2*m+2*n+1-p][0]=t;
				v.x=(2*m+2*n+1-p);
				v.y=1;
				sp[2*m+2*n+1-p][1]=-1;
				ed[++get_].u=u;
				ed[get_].v=v;
				ed[get_].w=x3;
			}
		}
		sort(ed+1,ed+get_+1,cmp);
		int poi=0;
		bool flag=false;
		while(colored<n*m){
			++poi;
			spot u=ed[poi].u;
			spot v=ed[poi].v;
			if(sp[u.x][u.y]!=-1&&sp[v.x][v.y]==-1){
				sp[v.x][v.y]=sp[u.x][u.y];
				colored++;
			}else if(sp[u.x][u.y]==-1&&sp[v.x][v.y]!=-1){
				sp[u.x][u.y]=sp[v.x][v.y];
				colored++;
			}else if(sp[u.x][u.y]==-1&&sp[v.x][v.y]==-1){
				flag=true;
				sp[u.x][u.y]=-2;
				sp[v.x][v.y]=-2;
				colored+=2;
			}
		}
		long long ans=0;
		if(flag==false){
			for(int i=1;i<=get_;i++){
				spot u=ed[i].u;
				spot v=ed[i].v;
				if(sp[u.x][u.y]!=sp[v.x][v.y]){
					ans+=ed[i].w;
				}
			}
			cout<<ans<<endl;
			continue;
		}else{
			//if all black
			long long ans1=0,ans2=0;
			for(int i=1;i<=get_;i++){
				spot u=ed[i].u;
				spot v=ed[i].v;
				if(sp[u.x][u.y]!=sp[v.x][v.y]&&(sp[u.x][u.y]==0||sp[v.x][v.y]==0)){
					ans1+=ed[i].w;
				}
			}
			//all white
			for(int i=1;i<=get_;i++){
				spot u=ed[i].u;
				spot v=ed[i].v;
				if(sp[u.x][u.y]!=sp[v.x][v.y]&&(sp[u.x][u.y]==1||sp[v.x][v.y]==1)){
					ans2+=ed[i].w;
				}
			}
			ans=min_(ans1,ans2);
		}
		cout<<ans<<endl;
		continue;
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
2024/10/4 18:56
加载中...