1 条题解
-
0
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
- 上传者