Mike4235

LAH19_NINJA

Mar 22nd, 2021 (edited)
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. /*#pragma GCC optimize("Ofast")
  2. #pragma GCC optimize("unroll-loops")*/
  3. // only when really needed
  4.  
  5. /* GNU G++17 7.3.0: No long long for faster code
  6.    GNU G++17 9.2.0 (64 bit, msys 2): Long long only for faster code */
  7.  
  8. #include <bits/stdc++.h>
  9.  
  10. #define for1(i,a,b) for (int i = a; i <= b; i++)
  11. #define for2(i,a,b) for (int i = a; i >= b; i--)
  12. #define int long long
  13.  
  14. #define sz(a) (int)a.size()
  15. #define pii pair<int,int>
  16.  
  17. /*
  18. __builtin_popcountll(x) : Number of 1-bit
  19. __builtin_ctzll(x) : Number of trailing 0
  20. */
  21.  
  22. #define PI 3.1415926535897932384626433832795
  23. #define INF 1000000000000000000
  24. #define MOD 1000000007
  25. #define MOD2 1000000009
  26. #define EPS 1e-6
  27.  
  28. using namespace std;
  29.  
  30. struct edge{
  31.    
  32.     int u, v, sum, cnt;
  33.     bool operator< (const edge& other) {
  34.         if (cnt != other.cnt) return cnt < other.cnt;
  35.         return sum < other.sum;
  36.     }
  37.    
  38. };
  39.  
  40. int mul[4] = {1, 5, 25, 125};
  41. vector<pair<int, pii>> g[32000];
  42. vector<edge> v;
  43. bool flag[32000];
  44. int ans, ans1, ans2, ans3, t, n, m, parent[32000], sz[32000];
  45.  
  46. int find_set(int v) {
  47.    
  48.     return (v == parent[v] ? v : parent[v] = find_set(parent[v]));
  49.    
  50. }
  51.  
  52. void join_sets(int a, int b) {
  53.    
  54.     a = find_set(a);
  55.     b = find_set(b);
  56.    
  57.     if (a != b) {
  58.         if (sz[a] < sz[b]) swap(a, b);
  59.         parent[b] = a;
  60.         sz[a] += sz[b];
  61.     }
  62.    
  63. }
  64.  
  65. void dfs(int u) {
  66.    
  67.     ans++;
  68.     flag[u] = true;
  69.     for (auto e : g[u]) {
  70.         if (!flag[e.first] && e.second.second == 0) dfs(e.first);
  71.     }
  72.    
  73. }
  74.  
  75. signed main() {
  76.    
  77.     ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  78.    
  79.     freopen("NINJA.inp", "r", stdin);
  80.     freopen("NINJA.out", "w", stdout);
  81.    
  82.     cin >> t >> n >> m;
  83.    
  84.     for1(i,1,n) {
  85.         parent[i] = i;
  86.         sz[i] = 1;
  87.     }
  88.    
  89.     for1(i,1,m) {
  90.        
  91.         int a, b, sum = 0, cnt = 0;
  92.         string s;
  93.        
  94.         cin >> a >> b >> s;
  95.         for1(i,0,3) {
  96.             if (s[i] == 'E') cnt++;
  97.             else sum += mul[i] * (s[i] - 'A' + 1);
  98.         }
  99.        
  100.         g[a].push_back({b, {sum, cnt}});
  101.         g[b].push_back({a, {sum, cnt}});
  102.        
  103.         v.push_back({a, b, sum, cnt});
  104.        
  105.     }
  106.    
  107.     if (t == 1) {
  108.         dfs(1);
  109.         cout << ans;
  110.     }
  111.     else {
  112.        
  113.         sort(v.begin(), v.end());
  114.        
  115.         for (auto e : v) {
  116.             if (find_set(e.u) != find_set(e.v)) {
  117.                
  118.                 // Chi phi nho nhat
  119.                 ans1 += e.sum;
  120.  
  121.                 // So luong chuong ngai vat E nho nhat
  122.                 ans2 += e.cnt;
  123.  
  124.                 // So hanh lang co chua chuong ngai vat E
  125.                 if (e.cnt != 0) ans3++;
  126.                 join_sets(e.u, e.v);
  127.                
  128.             }
  129.         }
  130.        
  131.         if (t == 2) cout << ans3 << " " << ans2;
  132.         else cout << ans1;
  133.        
  134.     }
  135.    
  136. }
Advertisement
Add Comment
Please, Sign In to add comment