orazma

l.cpp

Aug 5th, 2026
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define ll long long
  5. #define pb push_back
  6. #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  7. #define mp make_pair
  8.  
  9. using namespace std;
  10.  
  11. const int MAXN = 2e5 + 5;
  12. const int INF = 1e9 + 7;
  13. const int MOD = 1e9 + 7;
  14.  
  15. ll binpower(ll x, ll y, ll mod){
  16.     if (y == 0)
  17.         return 1;
  18.     if (y % 2 == 1){
  19.         return (binpower(x, y - 1, mod) * x) % mod;
  20.     }
  21.     ll z = binpower(x, y / 2, mod);
  22.     return (z * z) % mod;
  23. }
  24. const int L = 19;
  25. pair <int, pair <int, int> > a[MAXN], b[MAXN];
  26. int tin[MAXN], tout[MAXN], up[MAXN][L + 1], mx[MAXN][L + 1];
  27. int dsu[MAXN], cnt[MAXN];
  28. vector <pair <int, int> > g[MAXN];
  29. int ffind(int x){
  30.     int y = x;
  31.     while (dsu[x] != x){
  32.         x = dsu[x];
  33.     }
  34.     int z;
  35.     while(dsu[y] != y){
  36.         z = dsu[y];
  37.         dsu[y] = x;
  38.         y = z;
  39.     }
  40.     return x;
  41. }
  42.  
  43. void uunion(int x, int y){
  44.     x = ffind(x);
  45.     y = ffind(y);
  46.  
  47.     if (cnt[x] > cnt[y]){
  48.         dsu[y] = x;
  49.         cnt[x] += cnt[y];
  50.     }
  51.     else{
  52.         dsu[x] = y;
  53.         cnt[y] += cnt[x];
  54.     }
  55. }
  56. bool was[MAXN];
  57. map <pair <int, int>, bool > ma;
  58. int timer = 0;
  59.  
  60. bool upper(int v, int u){
  61.     return (tin[v] <= tin[u] && tout[u] <= tout[v]);
  62. }
  63.  
  64. void dfs(int v, int pr = 0, int dist = 0){
  65.     was[v] = 1;
  66.     up[v][0] = pr;
  67.     mx[v][0] = dist;
  68.     tin[v] = ++timer;
  69.  
  70.     for (int i = 1; i <= L; i++){
  71.         up[v][i] = up[up[v][i - 1]][i - 1];
  72.         mx[v][i] = max(mx[v][i - 1], mx[up[v][i - 1]][i - 1]);
  73.     }
  74.  
  75.     for (auto [to, len] : g[v]){
  76.         if (!was[to]){
  77.             dfs(to, v, len);
  78.         }
  79.     }
  80.     tout[v] = ++timer;
  81. }
  82.  
  83. int lca(int a, int b){
  84.     if (upper(a, b))
  85.         return a;
  86.     if (upper(b, a)){
  87.         return b;
  88.     }
  89.  
  90.     for (int i = L; i >= 0; i--){
  91.         if (!upper(up[a][i], b)){
  92.             a = up[a][i];
  93.         }
  94.     }
  95.     return up[a][0];
  96. }
  97.  
  98. int get_max(int v, int v_lca){
  99.     int maxx = 0;
  100.  
  101.     for (int i = L; i >= 0; i--){
  102.         if (!upper(up[v][i], v_lca)){
  103.             maxx = max(maxx, mx[v][i]);
  104.             v = up[v][i];
  105.         }
  106.     }
  107.     if (v != v_lca)
  108.         maxx = max(maxx, mx[v][0]);
  109.     return maxx;
  110. }
  111.  
  112. void solve(int Test){
  113.     tout[0] = INF;
  114.     int n, m;
  115.     cin >> n >> m;
  116.  
  117.     for (int i = 1; i <= n; i++){
  118.         cnt[i] = 1;
  119.         dsu[i] = i;
  120.     }
  121.     for (int i = 1; i <= m; i++){
  122.         cin >> b[i].s.f >> b[i].s.s >> b[i].f;
  123.         a[i] = b[i];
  124.     }
  125.     sort(b + 1, b + m + 1);
  126.     ll ans = 0;
  127.     for (int i = 1; i <= m; i++){
  128.         if (ffind(b[i].s.f) != ffind(b[i].s.s)){
  129.             uunion(b[i].s.f, b[i].s.s);
  130.             ans += b[i].f;
  131.             g[b[i].s.f].pb({b[i].s.s, b[i].f});
  132.             g[b[i].s.s].pb({b[i].s.f, b[i].f});
  133.             ma[b[i].s] = 1;
  134.         }
  135.     }
  136.  
  137.     dfs(1);
  138.  
  139.     for (int i = 1; i <= m; i++){
  140.         if (ma.count(a[i].s) == 1){
  141.             cout << ans << '\n';
  142.         }
  143.         else{
  144.             int v_lca = lca(a[i].s.f, a[i].s.s);
  145.             int maxx = max(get_max(a[i].s.f, v_lca),
  146.                         get_max(a[i].s.s, v_lca));
  147.             cout << ans + a[i].f - maxx << "\n";
  148.         }
  149.     }
  150. }
  151.  
  152. main() {
  153.     IOS;
  154.     srand(time(0));
  155.     int t = 1;
  156.     //cin >> t;
  157.     int T = 1;
  158.     while(t--){
  159.         solve(T);
  160.         T++;
  161.     }
  162. }
  163.  
Advertisement
Add Comment
Please, Sign In to add comment