几乎一样的三个代码为什么有的AC有的不行??
查看原帖
几乎一样的三个代码为什么有的AC有的不行??
1159426
rome1楼主2023/12/30 10:32

我真的麻了 我现在有三个代码 一个50 一个70 一个 100 我不知道有什么区别

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define N 1000100
long long t,n,f[N],b[N*2];
struct fun
{
	long long x;
	long long y;
	long long e;
}a[N];
bool cmp(fun f,fun g)
{
	return f.e>g.e;
}
long long Find(long long x)
{
	if(f[x]==x)
	{
		return x;
	}
	return f[x]=Find(f[x]);
}
int main ()
{
	scanf("%lld",&t);
	while(t--)
	{
		long long cnt=0;
		scanf("%lld",&n);
		memset(b,0,sizeof(b));
		memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
		for(long long i=1;i<=n;i++)
		{
			scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].e);
			b[++cnt]=a[i].x;
			b[++cnt]=a[i].y;
			f[i]=i;
		}
		sort(b+1,b+1+cnt);
		long long cnt1=unique(b+1,b+1+cnt)-(b+1);
		for(long long i=1;i<=n;i++)
		{
			a[i].x=lower_bound(b+1,b+cnt1+1,a[i].x)-b;
			a[i].y=lower_bound(b+1,b+cnt1+1,a[i].y)-b;
		}
		sort(a+1,a+1+n,cmp);
		bool flag=0;
		for(long long i=1;i<=n;i++)
		{
			long long xx=Find(a[i].x),yy=Find(a[i].y);
			if(a[i].e==1)
			{
				f[xx]=yy;
			}
			else
			{
				if(xx==yy)
				{
					printf("NO\n");
					flag=1;
					break;
				}
			}
		}
		if(!flag)
		printf("YES\n");
	}
	return 0;
}

这个70

#include<bits/stdc++.h>
using namespace std;
int n,t;
int f[1000005],book[2000005];
struct node{
	int x,y,e;
}a[1000005];
bool cmp(node a,node b){
	return a.e>b.e;
}
int find(int x){
	if(f[x]==x)return x;
	else return f[x]=find(f[x]);
}
int main()
{
    cin>>t;
    for(int i=1;i<=t;i++){
    	cin>>n;
    	int tot=-1;
    	memset(book,0,sizeof(book));
        memset(a,0,sizeof(a));
        memset(f,0,sizeof(f));
        for(int j=1;j<=n;j++){
        	cin>>a[j].x>>a[j].y>>a[j].e;
        	book[++tot]=a[i].x;
            book[++tot]=a[i].y;
		}
		sort(book,book+tot+1);
		int q=unique(book,book+tot+1)-book;
		for(int j=1;j<=n;j++){
			a[j].x=lower_bound(book,book+q+1,a[j].x)-book;
			a[j].y=lower_bound(book,book+q+1,a[j].y)-book;
		}
		for(int j=1;j<=q;j++)f[j]=j;
		sort(a+1,a+n+1,cmp);
		int flag=1;
		for(int j=1;j<=n;j++){
            int r1=find(a[j].x);
            int r2=find(a[j].y);
            if(a[j].e){
                f[r1]=r2;  
            }
			else if(r1==r2){
                printf("NO\n");
                flag=0;  
                break;
            }
        }
        if(flag)printf("YES\n");  
	}
}

这个50

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std;
int t,n,f[1000007],book[1000007*3];  //t表示t组数据,n表示有n个操作,f[]是我们并查集的数字,book[]是离散化的数组 
struct node{
    int x,y,e;
}a[1000001];  
bool cmp(node a,node b){
    return a.e>b.e;
}//排 序将e==1的放在前面 
inline void first(int kkk){
    for(int i=1;i<=kkk;i++)  f[i]=i;
}//初 始 化 
int get(int x){
    if(x==f[x]) return x;
    return f[x]=get(f[x]);
}
int main(){
    scanf("%d",&t);
    while(t--){
      int tot=-1;
      memset(book,0,sizeof(book));
      memset(a,0,sizeof(a));
      memset(f,0,sizeof(f));
    int flag=1;
        scanf("%d",&n);
       
        for(int i=1;i<=n;i++){
            scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].e);
            book[++tot]=a[i].x;
            book[++tot]=a[i].y;
        }
        sort(book,book+tot);//排序 
        int reu=unique(book,book+tot)-book;  //去重 
        for(int i=1;i<=n;++i){
           a[i].x=lower_bound(book,book+reu,a[i].x)-book;
           a[i].y=lower_bound(book,book+reu,a[i].y)-book;   
        } 
        first(reu);   //初始化 
        sort(a+1,a+n+1,cmp);  //按e排序 
        for(int i=1;i<=n;i++){
            int r1=get(a[i].x);
            int r2=get(a[i].y);
            if(a[i].e){
                f[r1]=r2;  //就是我们的merge操作 
            }else if(r1==r2){
                printf("NO\n");
                flag=0;  //如果不满足条件,标记为否 
                break;
            }
        }
        if(flag)    printf("YES\n");   //都满足条件了 
    }
    return 0;
}

这个100???

2023/12/30 10:32
加载中...