#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
#define F first
#define S second
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
const ld PI = 3.1415926535;
const ld eps = 1e-9;
const int N = 2e5 + 5;
const int M = 7e6 + 1;
ll mod = 1e9+7;
const int infi = 1e9 + 5;
const ll infl = 1e16;
const int P = 31;
int mult(int a, int b) {
return a * 1LL * b % mod; }
int sum(int a, int b) {
if(a + b >= mod)
return a + b - mod;
if(a + b < 0)
return a + b + mod;
return a + b;
}
ll binpow(ll a, ll n) {
if (n == 0) return 1;
if (n % 2 == 1) {
return binpow(a, n - 1) * a % (mod);
} else {
ll b = binpow(a, n / 2);
return b * b % (mod);
}
}
int p[N], sz[N];
pair<int, pii> edg[N];
vector<pii> g[N];
pair<int, pii> vec[N];
int n, m;
void clear(){
for(int i = 1; i <= n; i++)
p[i] = i, sz[i] = 1;
}
int getp(int v){
if(v == p[v])
return v;
return p[v] = getp(p[v]);
}
void uni(int a, int b){
a = getp(a);
b = getp(b);
if(a == b)
return;
if(sz[a] > sz[b])
swap(a, b);
p[a] = b;
sz[b] += sz[a];
}
pair<int, pii> dfs(int v, int nd, int p, int w){
if(v == nd){
return {w, {p, v}};
}
int mx = -infi;
pii ans = {-1, -1};
for(auto to : g[v]){
int u = to.F, w = to.S;
if(u == p) continue;
auto ret = dfs(u, nd, v, w);
if(ret.F == -infi)
continue;
if(mx < ret.F){
mx = ret.F;
ans = ret.S;
}
}
if(mx != -infi){
if(mx < w){
mx = w;
ans = {p, v};
}
}
return {mx, ans};
}
void solve() {
cin >> n >> m;
for(int i = 1; i <= m; i++){
int a, b, w;
cin >> a >> b >> w;
edg[i] = {w, {a, b}};
}
for(int i = 1; i <= n; i++)
p[i] = i, sz[i] = 1;
sort(edg + 1, edg + m + 1);
vector<pair<int, pii>> rt = {};
for(int i = m; i >= 1; i--){
auto ret = dfs(edg[i].S.F, edg[i].S.S, -1, -infi);
if(ret.F != -infi){
int ps = 0;
for(int j = 0; j < sz(g[ret.S.F]); j++){
if(g[ret.S.F][j].F == ret.S.S)
ps = j;
}
g[ret.S.F].erase(g[ret.S.F].begin() + ps);
for(int j = 0; j < sz(g[ret.S.S]); j++){
if(g[ret.S.S][j].F == ret.S.F)
ps = j;
}
g[ret.S.S].erase(g[ret.S.S].begin() + ps);
}
g[edg[i].S.F].push_back({edg[i].S.S, edg[i].F});
g[edg[i].S.S].push_back({edg[i].S.F, edg[i].F});
vec[i] = ret;
int ps = -1;
for(int j = 0; j < sz(rt); j++){
auto e = rt[j];
if((e.S.F == ret.S.F && e.S.S == ret.S.S && e.F == ret.F) ||
(e.S.F == ret.S.S && e.S.S == ret.S.F && e.F == ret.F)) ps = j;
}
if(ps != -1)
rt.erase(rt.begin() + ps);
rt.insert(rt.begin(), edg[i]);
}
for(int i = 1; i <= n; i++)
g[i].clear();
int cur = 0;
vector<pair<int, pii>> lf = {};
int q;
cin >> q;
while(q--){
int x;
cin >> x;
while(cur < m && edg[cur + 1].F <= x){
cur++;
int ha = -1;
for(int j = 0; j < sz(rt); j++){
auto e = rt[j];
if((e.S.F == edg[cur].S.F && e.S.S == edg[cur].S.S && e.F == edg[cur].F) ||
(e.S.F == edg[cur].S.S && e.S.S == edg[cur].S.F && e.F == edg[cur].F)) ha = j;
}
if(ha != -1)
rt.erase(rt.begin() + ha);
if(vec[cur].F != -infi){
auto it = lower_bound(all(rt), vec[cur]);
rt.insert(it, vec[cur]);
}
int i = cur;
auto ret = dfs(edg[i].S.F, edg[i].S.S, -1, -infi);
if(ret.F != -infi){
int ps = 0;
for(int j = 0; j < sz(g[ret.S.F]); j++){
if(g[ret.S.F][j].F == ret.S.S)
ps = j;
}
g[ret.S.F].erase(g[ret.S.F].begin() + ps);
for(int j = 0; j < sz(g[ret.S.S]); j++){
if(g[ret.S.S][j].F == ret.S.F)
ps = j;
}
g[ret.S.S].erase(g[ret.S.S].begin() + ps);
}
g[edg[i].S.F].push_back({edg[i].S.S, -edg[i].F});
g[edg[i].S.S].push_back({edg[i].S.F, -edg[i].F});
int ps = -1;
for(int j = 0; j < sz(lf); j++){
auto e = lf[j];
if((e.S.F == ret.S.F && e.S.S == ret.S.S && e.F == -ret.F) ||
(e.S.F == ret.S.S && e.S.S == ret.S.F && e.F == -ret.F))
ps = j;
}
if(ps != -1)
lf.erase(ps + lf.begin());
lf.insert(lf.begin(), edg[i]);
}
ll ans = 0;
auto itl = lf.begin(), itr = rt.begin();
while(itl != lf.end() || itr != rt.end()){
pair<int, pii> ha;
if(itl == lf.end()){
ha = *itr;
itr++;
}else if(itr == rt.end()){
ha = *itl;
itl++;
}else if((x - itl->F) < (itr->F - x)){
ha = *itl;
itl++;
}else{
ha = *itr;
itr++;
}
if(getp(ha.S.F) == getp(ha.S.S)) continue;
uni(ha.S.S, ha.S.F);
ans += abs((ll)x - (ll)ha.first);
}
clear();
cout << ans << '\n';
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
for(int i = 1; i <= t; i ++){
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |