1 条题解

  • 0
    @ 2026-9-28 1:50:11

    1.题目大意:

    给定N个点的二维坐标,和M对关系,计算完每对关系后可以构成若干个联通块,求包围某个联通块所用的最小矩形周长。

    2.解题思路:

    并查集维护联通块,并维护每个联通块最大最小的x,y值,最后计算求每个联通块中的最小周长即可。

    ps:代码用了STL中的map和pair。

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    int f[200005];
    map<int,pair<int,int> >mp;
    map<pair<int,int>,int>q;
    int find(int x){//并查集
    	if(f[x]!=x){
    		f[x]=find(f[x]);
    	}
    	return f[x];
    }
    int ansx1[200005],ansy1[200005],ansx2[200005],ansy2[200005];
    int main(){
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=n;++i){
    		int l,r;
    		cin>>l>>r;
    		q[{l,r}]=i;//映射对
    		mp[i]={l,r};
    	}
    	for(int i=1;i<=n;++i)f[i]=i;
    	for(int i=1;i<=m;++i){
    		int l,r;
    		cin>>l>>r;
    		if(find(l)!=find(r)){
    			f[find(r)]=find(l);//合并操作
    		}
    	}
    	for(int i=1;i<=n;++i){
    		ansx1[i]=ansy1[i]=-0x3f3f3f3f;//x1 y1维护联通块最大x,y
    		ansx2[i]=ansy2[i]=0x3f3f3f3f;//x2 y2维护联通块最小x,y
    	}
    	for(int i=1;i<=n;++i){
    		int fa=find(i);
    		ansx1[fa]=max(ansx1[fa],mp[i].first);
    		ansx2[fa]=min(ansx2[fa],mp[i].first);
    		ansy1[fa]=max(ansy1[fa],mp[i].second);	
    		ansy2[fa]=min(ansy2[fa],mp[i].second);		
    	}
    	long long minn=1000000000000000;
    	for(int i=1;i<=n;++i){
    		if(ansx1[i]!=-0x3f3f3f3f&&ansy1[i]!=-0x3f3f3f3f&&ansx2[i]!=0x3f3f3f3f&&ansy2[i]!=0x3f3f3f3f)
            	minn=min(1LL*2*(ansx1[i]-ansx2[i]+ansy1[i]-ansy2[i]),minn);
    	}
    	cout<<minn<<"\n";
    	return 0;
    }
    
    
    

    最后贡献一组卡了我的数据(tcl):

    2 1
    100000000 100000000
    0 0
    1 2
    
    • 1

    信息

    ID
    6944
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者