제출 #1357040

#제출 시각아이디문제언어결과실행 시간메모리
1357040alexddSecurity Guard (JOI23_guard)C++20
50 / 100
164 ms45500 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q;
vector<int> con[200005], arb[200005];
int s[200005];

namespace DSU
{
    int father[200005], siz[200005], strongest[200005];
    void init()
    {
        for(int i=1;i<=n;i++)
        {
            father[i] = i;
            siz[i] = 1;
            strongest[i] = i;
        }
    }
    int get(int x)
    {
        if(father[x] != x)
            father[x] = get(father[x]);
        return father[x];
    }
    void unite(int x, int y)
    {
        x = get(x);
        y = get(y);
        if(x == y)
            return;
        if(siz[x] < siz[y])
            swap(x,y);
        siz[x] += siz[y];
        father[y] = x;
        if(s[strongest[y]] > s[strongest[x]])
            strongest[x] = strongest[y];
    }
}

bool cmp_s(int x, int y)
{
    return s[x] < s[y];
}

vector<int> mst[200005];
void get_mst()
{
    vector<pair<int, pair<int,int>>> edges;
    for(int i=1;i<=n;i++)
    {
        for(int j:con[i])
        {
            if(j <= i)
                continue;
            edges.push_back({s[i] + s[j], {i, j}});
        }
    }
    sort(edges.begin(), edges.end());

    DSU::init();
    for(auto [_,e]:edges)
    {
        if(DSU::get(e.first) != DSU::get(e.second))
        {
            DSU::unite(e.first, e.second);
            mst[e.first].push_back(e.second);
            mst[e.second].push_back(e.first);
        }
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        cin>>s[i];

    int rez = 0;
    int u,v;
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v;
        con[u].push_back(v);
        con[v].push_back(u);
    }

    get_mst();
    for(int i=1;i<=n;i++)
        con[i] = mst[i];

    /*vector<pair<pair<int,int>, pair<int,int>>> edges_ord;
    for(int u=1;u<=n;u++)
    {
        for(int v:con[u])
        {
            if(v <= u)
                continue;
            edges_ord.push_back({{max(s[u],s[v]), min(s[u],s[v])}, {u, v}});
        }
    }
    sort(edges_ord.begin(), edges_ord.end());

    DSU::init();
    for(auto [_,e]:edges_ord)
    {
        int i = e.first, x = e.second;
        if(s[i] < s[x])
            swap(i, x);
        assert(s[i] >= s[x]);
        if(DSU::get(i) != DSU::get(x))
        {
            int u = DSU::strongest[DSU::get(x)];
            rez += s[i] + s[x] - s[u];
            arb[i].push_back(u);
            DSU::unite(x, i);
        }
    }*/

    /*vector<pair<int,int>> ord;
    for(int i=1;i<=n;i++)
        ord.push_back({s[i], i});
    sort(ord.begin(), ord.end());

    vector<bool> done(n+2,0);
    DSU::init();
    for(auto [_,i]:ord)
    {
        sort(con[i].begin(), con[i].end(), cmp_s);
        for(int x:con[i])
        {
            if(!done[x])
                continue;
            if(DSU::get(x) != DSU::get(i))
            {
                int u = DSU::strongest[DSU::get(x)];
                rez += s[i] + s[x] - s[u];
                arb[i].push_back(u);
                DSU::unite(x, i);
            }
        }
        done[i] = 1;
    }*/

    int maxs = 0;
    for(int u=1;u<=n;u++)
    {
        maxs = max(maxs, s[u]);
        rez += s[u] * (int)con[u].size();
        rez -= s[u];
    }
    rez += maxs;

    cout<<rez;

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…