Advertisement
SorahISA

[HLHSOJ c040] E. 翻牌 (Card)

Jun 9th, 2020
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. /* https://judge.hlhs.hlc.edu.tw/ShowProblem?problemid=c040 */
  2. // #pragma GCC target("avx2")
  3. #pragma GCC optimize("O3", "unroll-loops")
  4.  
  5. // #include <bits/extc++.h>
  6. // using namespace __gnu_pbds;
  7.  
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10.  
  11. #define int long long
  12. #define double long double
  13. // template <typename T>
  14. // using pbds_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  15. using pii = pair<int, int>;
  16. template<typename T>
  17. using prior = priority_queue<T, vector<T>, greater<T>>;
  18. template<typename T>
  19. using Prior = priority_queue<T>;
  20.  
  21. #define X first
  22. #define Y second
  23. #define ALL(x) (x).begin(), (x).end()
  24. #define eb emplace_back
  25. #define pb push_back
  26.  
  27. #define fastIO() ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  28. #define RANDOM() random_device __rd; \
  29.                  mt19937 __gen = mt19937(__rd()); \
  30.                  uniform_int_distribution<int> __dis(1, 1E8); \
  31.                  auto rnd = bind(__dis, __gen)
  32.  
  33. const int INF = 1E18;
  34. const int mod = 1E9 + 7;
  35. const int maxn = 2E6 + 5;
  36.  
  37. int scc_id = 0;
  38. vector<int32_t> adj[maxn];
  39. int32_t scc[maxn], sz[maxn];
  40. int inv[maxn], minVal[maxn];
  41. map<int, int> disc;
  42. stack<int32_t> stk;
  43.  
  44. set<int> st;
  45. vector<pii> v;
  46.  
  47. void dfs(int now) {
  48.     minVal[scc_id] = inv[now];
  49.     stk.push(now);
  50.    
  51.     while (!stk.empty()) {
  52.         now = stk.top(), stk.pop();
  53.         if (scc[now]) continue;
  54.        
  55.         scc[now] = scc_id;
  56.         ++sz[scc_id], minVal[scc_id] = min(minVal[scc_id], inv[now]);
  57.        
  58.         for (auto x : adj[now]) {
  59.             if (!scc[x]) stk.push(x);
  60.         }
  61.     }
  62. }
  63.  
  64. int32_t main() {
  65.     // freopen("s06_01.in", "r", stdin);
  66.     fastIO();
  67.    
  68.     int n, tok = 0, tot = 0;
  69.     cin >> n, v.resize(n);
  70.    
  71.     for (auto &x : v) {
  72.         cin >> x.X >> x.Y;
  73.        
  74.         if (!st.count(x.X)) tot += x.X, st.insert(x.X), disc[x.X] = ++tok, inv[tok] = x.X;
  75.         if (!st.count(x.Y)) tot += x.Y, st.insert(x.Y), disc[x.Y] = ++tok, inv[tok] = x.Y;
  76.        
  77.         x.X = disc[x.X], x.Y = disc[x.Y];
  78.         adj[x.X].eb(x.Y), adj[x.Y].eb(x.X);
  79.     }
  80.    
  81.     for (int i = 1; i <= tok; ++i) {
  82.         if (!scc[i]) ++scc_id, dfs(i);
  83.     }
  84.    
  85.     for (auto x : v) --sz[scc[x.X]];
  86.    
  87.     for (int i = 1; i <= scc_id; ++i) {
  88.         if (sz[i] == 1) tot -= minVal[i]; /// N nodes, N-1 edges ///
  89.     }
  90.    
  91.     cout << tot << "\n";
  92.    
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement