Advertisement
Hezov

Pbinfo TrumpLandia

Jun 13th, 2025
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <array>
  5. using namespace std;
  6. ifstream cin("trumplandia.in");
  7. ofstream cout("trumplandia.out");
  8. typedef long long ll;
  9. const int mxN = 2e5;
  10. vector<array<int,4>> edges, sorted;
  11. vector<array<int,2>> adj[mxN+10];
  12. ll used[mxN+10], sol[mxN+10],p[20][mxN+10], par[mxN+10],sizes[mxN+10];
  13. ll maxEdge[20][mxN+10], totalCost, depth[mxN+10];
  14. bool visited[mxN+10];
  15. void DFS(int node)
  16. {
  17.     visited[node] = true;
  18.     for(auto it : adj[node])
  19.         if(!visited[it[0]])
  20.         {
  21.            depth[it[0]] = depth[node] + 1;
  22.            p[0][it[0]] = node;
  23.            maxEdge[0][it[0]] = it[1];
  24.            visited[it[0]] = true;
  25.            DFS(it[0]);
  26.         }
  27. }
  28. int get(int a)
  29. {
  30.     if(a != par[a])
  31.         par[a] = get(par[a]);
  32.     return par[a];
  33. }
  34. void unite(int a, int b)
  35. {
  36.     a = get(a);
  37.     b = get(b);
  38.     if(a == b) return;
  39.     if(sizes[a] < sizes[b]) swap(a,b);
  40.     par[b] = a;
  41.     sizes[a] += sizes[b];
  42. }
  43. int up(int a, int k)
  44. {
  45.     for(int bit = 0;bit<=18;bit++)
  46.         if((1<<bit) & k)
  47.             a = p[bit][a];
  48.     return a;
  49. }
  50. ll upMax(int a, int k)
  51. {
  52.     ll sol = 0;
  53.     for(int bit = 0;bit<=18;bit++)
  54.         if((1<<bit) & k)
  55.             sol = max(sol,maxEdge[bit][a]), a = p[bit][a];
  56.     return sol;
  57. }
  58. int LCA(int a, int b)
  59. {
  60.     if(depth[a] < depth[b]) swap(a,b);
  61.     if(depth[a] != depth[b]) a = up(a,depth[a] - depth[b]);
  62.     for(int bit = 18;bit>=0 && a != b;bit--)
  63.     {
  64.         int aux1 = up(a, (1<<bit) - 1);
  65.         int aux2 = up(b, (1<<bit) - 1);
  66.         if(aux1 != aux2)
  67.             a = p[0][aux1], b = p[0][aux2];
  68.     }
  69.     return a;
  70. }
  71. int main()
  72. {
  73.     int n , m , q;
  74.     cin >> n >> m >> q;
  75.     for(int i = 1;i<=n;i++)
  76.         par[i] = i, sizes[i] = 1;
  77.     for(int i = 1;i<=m;i++)
  78.     {
  79.         int a, b, w;
  80.         cin >> a >> b >> w;
  81.         edges.push_back({w,a,b,i});
  82.     }
  83.     sorted = edges;
  84.     sort(sorted.begin(),sorted.end());
  85.     for(auto it : sorted)
  86.     {
  87.         if(get(it[1]) != get(it[2]))
  88.         {
  89.             unite(it[1],it[2]);
  90.             totalCost += it[0];
  91.             adj[it[1]].push_back({it[2],it[0]});
  92.             adj[it[2]].push_back({it[1],it[0]});
  93.             used[it[3]] = true;
  94.         }
  95.     }
  96.     depth[1] = 1;
  97.     DFS(1);
  98.     for(int i = 1;i<=18;i++)
  99.         for(int j = 1;j<=n;j++)
  100.         {
  101.             p[i][j] = p[i-1][p[i-1][j]];
  102.             maxEdge[i][j] = max(maxEdge[i-1][j], maxEdge[i-1][p[i-1][j]]);
  103.         }
  104.     cout << totalCost << '\n';
  105.     for(int i = 0;i<m;i++)
  106.     {
  107.         if(used[i+1]) sol[i+1] = totalCost;
  108.         else
  109.         {
  110.             int a = edges[i][1], b = edges[i][2];
  111.             int lca = LCA(a,b);
  112.             int removed = max(upMax(a,depth[a] - depth[lca]), upMax(b,depth[b] - depth[lca]));
  113.             sol[i+1] = totalCost - removed + edges[i][0];
  114.         }
  115.     }
  116.     for(int i = 1;i<=q;i++)
  117.     {
  118.         int query; cin >> query;
  119.         cout << sol[query] << '\n';
  120.     }
  121.     return 0;
  122. }
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement