求助,55pts
查看原帖
求助,55pts
760291
zhangbo1000楼主2024/9/28 13:53

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<deque>
#include<map>
using namespace std;

namespace code{
	constexpr int N=50005,M=200005;
	using ll=long long;
	using ull=unsigned long long;
#define F(i,x,y) for(int i=(x),__tt2__=(y);i<=__tt2__;i++)
#define R(i,x,y) for(int i=(x),__tt2__=(y);i>=__tt2__;i--)
#define _F(i,x,y) for(int i=(x),__tt2__=(y);i<__tt2__;i++)
#define _R(i,x,y) for(int i=(x),__tt2__=(y);i>__tt2__;i--)
#define debug(x) cout<<#x<<'='<<(x)<<endl
	int fa[N],rank[N];
	int find(const int& x){
		return (x==fa[x])?(x):(fa[x]=find(fa[x]));
	}
	void link(int x,int y){
		x=find(x);
		y=find(y);
		if(rank[x]<rank[y]){
			fa[x]=fa[y];
		}
		else {
			fa[y]=fa[x];
			rank[y]+=(rank[x]==rank[y]);
		}
	}
	struct way{
		int u,v,w;
		constexpr way(const int& _u=0,const int& _v=0,const int& _w=0):u(_u),v(_v),w(_w){}
	}a[M];
	void sort(way a[],const int& size){
		int cnt[256];
		way* temp=new way[size+1];
		for(int i=0;i<=8;i+=8){
			memset(cnt,0,sizeof(cnt));
			for(way* s=a;s<a+size;s++){
				cnt[(s->w>>i)&255]++;
			}
			F(j,1,255){
				cnt[j]+=cnt[j-1];
			}
			for(way* s=a+size-1;s>=a;s--){
				temp[--cnt[(s->w>>i)&255]]=*s;
			}
			_F(j,0,size)a[j]=temp[j];
		}
	}
	bool check(const int& max,const int& min,const int& n,const int& m){
		F(i,1,n)fa[i]=i;
		int tot=0;
		_F(i,0,m){
			if((a[i].w>max)||(a[i].w<min)||(find(a[i].v)==find(a[i].u)))continue;
			tot++;
			link(a[i].u,a[i].v);
			if(tot==n-1)break;
		}
		return tot==n-1;
	}
	signed main(){
		int n,m;
		cin>>n>>m;
		_F(i,0,m){
			cin>>a[i].u>>a[i].v>>a[i].w;
		}
		sort(a,m);
		int l1=0,l2=0,r1=10005,r2=10005,mid1,mid2,ans=114514,tmp;
		while(l1<=r1){
			mid1=(l1+r1)>>1;
			l2=0;
			r2=10005;
			tmp=ans;
			while(l2<=r2){
				mid2=(l2+r2)>>1;
				if(mid2<mid1){
					l2=mid2+1;
				}
				else if(check(mid2,mid1,n,m)){
					ans=min(mid2-mid1,ans);
					r2=mid2-1;
				}
				else l2=mid2+1;
			}
			if(tmp==ans)r1=mid1-1;
			else l1=mid1+1;
		}
		cout<<ans;
		return 0;
	}
}

signed main(){return code::main();}

WA 了 33 个点

2024/9/28 13:53
加载中...