CF上MLE求救玄关 马蜂优良
查看原帖
CF上MLE求救玄关 马蜂优良
592133
Mr_Potato楼主2024/10/28 18:45

CFCF 上第 55 个点 MLEMLE

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

int n,mst,cnt_to_zero,cnt_line;

int k[2010],c[2010];

struct Node {
    int x,y;
    Node() {}
    Node(int a,int b) : x(a),y(b) {}
} node[2010];

int Manhatton(Node a,Node b) {
    return abs(a.x - b.x) + abs(a.y - b.y);
}

struct Edge {
    int u,v,w;
    Edge() {}
    Edge(int a,int b) : u(a),v(b) {
        if (u == 0) {
            w = c[v];
        } else if (v == 0) {
            w = c[u];
        } else {
            w = (k[u] + k[v]) * Manhatton(node[u],node[v]);
        }
    }
};
vector<Edge> edge;

vector<int> city_to_zero;
vector<Node> line;

class DSU {
    int fa[2010];
public :
    void init(int size) {
        for (int i=0; i<=size; ++i) {
            fa[i] = i;
        }
    }
    int find(int x) {
        if (x != fa[x]) {
            fa[x] = find(fa[x]);
        }
        return fa[x];
    }
    void unite(int x,int y) {
        fa[find(x)] = find(y);
    }
} dsu;

int Kruskal() {
    sort(edge.begin(),edge.end(),[](Edge a,Edge b) {
        return a.w < b.w;
    });
    for (auto ver : edge) {
        if (dsu.find(ver.u) != dsu.find(ver.v)) {
            dsu.unite(ver.u,ver.v);
            mst += ver.w;
            if (ver.u == 0 or ver.v == 0) {
                ++cnt_to_zero;
                city_to_zero.push_back(ver.v == 0 ? ver.u : ver.v);
            } else {
                ++cnt_line;
                line.push_back({ver.u,ver.v});
            }
        }
    }
    return mst;
}

signed main() {
    scanf("%lld",&n);
    dsu.init(n);
    for (int i=1; i<=n; ++i) {
        scanf("%lld %lld",&node[i].x,&node[i].y);
    }
    for (int i=1; i<=n; ++i) {
        scanf("%lld",&c[i]);
    }
    for (int i=1; i<=n; ++i) {
        scanf("%lld",&k[i]);
    }
    for (int i=1; i<=n; ++i) {
        edge.push_back({0,i}), edge.push_back({i,0});
        for (int j=1; j<=n; ++j) {
            edge.push_back({i,j}), edge.push_back({j,i});
        }
    }
    printf("%lld\n",Kruskal());
    printf("%lld\n",cnt_to_zero);
    for (auto city : city_to_zero) {
        printf("%lld ",city);
    }
    printf("\n%lld\n",cnt_line);
    for (auto cityline : line) {
        printf("%lld %lld\n",cityline.x,cityline.y);
    }
    return 0;
}
2024/10/28 18:45
加载中...