求助,关于sort
  • 板块学术版
  • 楼主Chinshyo
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/7/19 23:22
  • 上次更新2023/10/27 19:25:15
查看原帖
求助,关于sort
312820
Chinshyo楼主2022/7/19 23:22

这里有一个做离散化用的数组,本来下标从1开始。代码如下

#include<bits/stdc++.h>
using namespace std;

const int MaxN = 100005;

struct edge {
    int x, y, e;
} input[MaxN + 5];
int a[2 * MaxN + 10], fa[2 * MaxN + 10];

bool cmp (edge e1, edge e2) {
    return e1.e > e2.e;
}

int find(int x) {
    if(fa[x] == x) return x;
    else return fa[x] = find(fa[x]);
}

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        int n;
        scanf("%d", &n);
        int cnt = -1;
        for(int i = 1; i <= n; i++) {
            edge _i;
            scanf("%d%d%d", &_i.x, &_i.y, &_i.e);
            input[i] = _i;
            a[++cnt] = _i.x;
            a[++cnt] = _i.y;
        }
        sort(a, a + cnt);
        int num = unique(a, a + cnt) - a;
        
        for(int i = 1; i <= n; i++) {
            input[i].x = lower_bound(a, a + num, input[i].x) - a;
            input[i].y = lower_bound(a, a + num, input[i].y) - a;
        }

        for(int i = 1; i <= num; i++) fa[i] = i;
        
        sort(input + 1, input + n + 1, cmp);

        bool flag = true;
        for(int i = 1; i <= n; i++) {
            int x = input[i].x, y = input[i].y;
            if(input[i].e == 1) {
                fa[x] = y;
            } else {
                if(find(x) == find(y)) {
                    printf("NO\n");
                    flag = false;
                    break;
                }
            }
        }
        if(flag) printf("YES\n");
    }
    return 0;
}

中间的sort也加了1,但是提交结果花花绿绿的。后来我改成下标从0开始,结果居然AC了。我对这种迭代器的使用不够熟悉。求大佬们解释!万分感谢。

AC代码如下

#include<bits/stdc++.h>
using namespace std;

const int MaxN = 100005;

struct edge {
    int x, y, e;
} input[MaxN + 5];
int a[2 * MaxN + 10], fa[2 * MaxN + 10];

bool cmp (edge e1, edge e2) {
    return e1.e > e2.e;
}

int find(int x) {
    if(fa[x] == x) return x;
    else return fa[x] = find(fa[x]);
}

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
		memset(fa, 0, sizeof(fa));
		memset(a, 0, sizeof(a));
		memset(input, 0, sizeof(input));
        int n;
        scanf("%d", &n);
        int cnt = -1;
        for(int i = 1; i <= n; i++) {
            edge _i;
            scanf("%d%d%d", &_i.x, &_i.y, &_i.e);
            input[i] = _i;
            a[++cnt] = _i.x;
            a[++cnt] = _i.y;
        }
        sort(a, a + cnt);
        int num = unique(a, a + cnt) - a;
        
        for(int i = 1; i <= n; i++) {
            input[i].x = lower_bound(a, a + num, input[i].x) - a;
            input[i].y = lower_bound(a, a + num, input[i].y) - a;
        }

        for(int i = 1; i <= num; i++) fa[i] = i;
        
        sort(input + 1, input + n + 1, cmp);

        bool flag = true;
        for(int i = 1; i <= n; i++) {
            int x = input[i].x, y = input[i].y;
            if(input[i].e == 1) {
                fa[find(x)] = find(y);
            } else {
                if(find(x) == find(y)) {
                    printf("NO\n");
                    flag = false;
                    break;
                }
            }
        }
        if(flag) printf("YES\n");
    }
    return 0;
}
2022/7/19 23:22
加载中...