10pts求调
查看原帖
10pts求调
892625
WangYinxiAlex楼主2025/6/21 22:10
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
const int N=1e5+5;

struct Node2 {
    int x;
    int y;
    bool operator<(const Node2& other) const {
        if (x != other.x) return x < other.x;
        return y < other.y;
    }
};

struct Node {
    int x;
    int y;
    int relation;
};

vector<int> f1, f2;
map<Node2, int> criminals2;
Node criminals[N];
int n, m;

bool cmp(Node x, Node y) {
    return x.relation < y.relation;
}

bool check(int mid) {
    f1.clear();
    f2.clear();
    for (int i = m - 1; i >= mid; i--) {
        bool f_1 = false, f_2 = false;
        for (int j = 0; j < f1.size(); j++) {
            Node2 vv = { f1[j], criminals[i].x };
            auto it = criminals2.find(vv);
            if (it != criminals2.end() && it->second > criminals[mid].relation) {
                f_1 = true;
                break;
            }
        }
        
        for (int j = 0; j < f2.size(); j++) {
            Node2 vv = { f2[j], criminals[i].x };
            auto it = criminals2.find(vv);
            if (it != criminals2.end() && it->second > criminals[mid].relation) {
                f_2 = true;
                break;
            }
        }
        
        if (f_1 && f_2) return false;
        if (f_1 && !f_2) {
            f2.push_back(criminals[i].x);
            for (int j = 0; j < f2.size(); j++) {
                Node2 vv = { f2[j], criminals[i].y };
                auto it = criminals2.find(vv);
                if (it != criminals2.end() && it->second > criminals[mid].relation) 
                    return false;
            }
            f1.push_back(criminals[i].y);
        } else if (f_2 && !f_1) {
            f1.push_back(criminals[i].x);
            for (int j = 0; j < f1.size(); j++) {
                Node2 vv = { f1[j], criminals[i].y };
                auto it = criminals2.find(vv);
                if (it != criminals2.end() && it->second > criminals[mid].relation) 
                    return false;
            }
            f2.push_back(criminals[i].y);
        } else if (!f_1 && !f_2) {
            f1.push_back(criminals[i].x);
            f2.push_back(criminals[i].y);
        }
    }
    return true;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &criminals[i].x, &criminals[i].y, &criminals[i].relation);
        criminals2[{criminals[i].x, criminals[i].y}] = criminals[i].relation;
        criminals2[{criminals[i].y, criminals[i].x}] = criminals[i].relation;
    }
    sort(criminals, criminals + m, cmp);
    
    int l = 0, r = m;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    
    if (l == 0) printf("0\n");
    else printf("%d\n", criminals[l-1].relation);
    
    return 0;
}
2025/6/21 22:10
加载中...