Submission #710161

#TimeUsernameProblemLanguageResultExecution timeMemory
710161Paul_Liao_1457Reconstruction Project (JOI22_reconstruction)C++17
7 / 100
5056 ms13348 KiB
//記得跳題
//#pragma GCC optimize("O3,unroll_loops")
//#pragma GCC target("avx2")
#include<iostream>
#include<array>
#include<vector>
#include<string>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<cstring>
#include<iomanip>
#include<bitset>
#include<tuple>
#include<random>

using namespace std;

#define ll long long
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define INF (ll)(2e9+5)
#define S second
#define F first
#define pb push_back
#define mp make_pair
#define AC ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"

vector<pair<int, pair<int, int> > > e, tmp;

int fa[505];

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

void merge(int a, int b) {
    fa[b] = a;
}

int n, m, q;

void sub1() {
    FOR(j, 0, q) {
        int x; cin >> x;
        
        tmp.clear();
        
        FOR(i, 0, m) tmp.pb(mp(abs(e[i].F - x), mp(e[i].S.F, e[i].S.S)));
        sort(tmp.begin(), tmp.end());
        
        ll ans = 0;
        
        FOR(i, 1, n+1) {
            fa[i] = i;
        }
        
        FOR(i, 0, m) {
            int a = find(tmp[i].S.F), b = find(tmp[i].S.S);
            if (a != b) {
                ans += tmp[i].F;
                merge(a, b);
            }
        }
        cout << ans << endl;
    }
}

set<int> st[505];

signed main() {
    AC;
    // plz
    
    cin >> n >> m;
    FOR(i, 0, m) {
        int a, b, c; cin >> a >> b >> c;
        e.pb(mp(c,mp(a,b)));
    }
    
    cin >> q;
    
    if (q <= 10) {
        sub1();
    } else {
        for (auto i:e) {
            st[i.S.F].insert(i.F);
        }
        FOR(i, 0, q) {
            int x; cin >> x;
            ll ans = 0;
            FOR(j, 1, n+1) {
                int minn = INF;
                auto it = st[j].lower_bound(x);
                if (it != st[j].end()) {
                    minn = min(minn, *it - x);
                }
                if (it != st[j].begin()) {
                    minn = min(minn, x - *prev(it));
                }
                ans += minn;
            }
            cout << ans << endl;
        }
    }
    
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...