#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e5+5;
struct P{int x,i;}X[M],Y[M],Z[M];
struct E{
int x,y,c;
bool operator<(const E&A)const{
return c<A.c;
}
}G[M*30];
bool cmp(P A,P B){return A.x<B.x;}
int n,fa[M],num;
int find(int x){
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
ll solve(){
ll ans=0;
int res=n-1;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=num;i++){
int x=G[i].x,y=G[i].y,c=G[i].c;
if(find(x)==find(y))continue;
else{
fa[find(x)]=find(y);
res--;
ans+=c;
if(!res)return ans;
}
}
if(res)return -1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d %d %d",&X[i].x,&Y[i].x,&Z[i].x);
Y[i].i=Z[i].i=X[i].i=i;
}
sort(X+1,X+1+n,cmp);
sort(Y+1,Y+1+n,cmp);
sort(Z+1,Z+1+n,cmp);
for(int i=1;i<n;i++)
G[++num]=(E){X[i].i,X[i+1].i,X[i+1].x-X[i].x};
for(int i=1;i<n;i++)
G[++num]=(E){Y[i].i,Y[i+1].i,Y[i+1].x-Y[i].x};
for(int i=1;i<n;i++)
G[++num]=(E){Z[i].i,Z[i+1].i,Z[i+1].x-Z[i].x};
sort(G+1,G+1+num);
ll ans=solve();
printf("%lld",ans);
return 0;
}
B
反思
- 怎么简单的模拟题没有AC太不应该了!!!!!!
- 我没有把模拟的方法和复杂度想得透彻就开始敲代码
∗3
思考流程
- 没有什么可以说的。我们直接可以算出每个人个座位的距离,把它排序即可。
#include<bits/stdc++.h>
using namespace std;
const int M=50*50+5;
char str[M][M];
bool mark[M];
int num_a,num_b,num,cnt[M],dis[M],n,m,ans;
struct P{
int x,y;
int operator+(const P&A)const{
return (A.x-x)*(A.x-x)+(A.y-y)*(A.y-y);
}
}A[M],B[M];
struct E{
int a,b,c;
bool operator <(const E &A)const{return c<A.c;}
}G[M*M];
int main(){
memset(dis,63,sizeof(dis));
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)scanf("%s",str[i]);
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(str[i][j]=='X')A[++num_a]=(P){i,j};
if(str[i][j]=='L')B[++num_b]=(P){i,j};
}
for(int i=1;i<=num_a;i++)for(int j=1;j<=num_b;j++)G[++num]=(E){i,j,A[i]+B[j]};
sort(G+1,G+num+1);
for(int i=1;i<=num;i++){
int a=G[i].a,b=G[i].b,c=G[i].c;
if(mark[a]||dis[b]<c)continue;
dis[b]=c;mark[a]=1;cnt[b]++;
}
for(int i=1;i<=num_b;i++)if(cnt[i]>1)ans++;
printf("%d\n",ans);
return 0;
}