welleyth

Day6 D

Aug 21st, 2021
1,522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. using namespace std;
  6. using namespace __gnu_pbds;
  7.  
  8. #define pb push_back
  9. #define int long long
  10. #define uint __int128
  11. #define mp make_pair
  12. #define left left_compile
  13. #define right right_compile
  14.  
  15. #pragma GCC optimize("O3")
  16. #pragma GCC optimize("unroll-loops")
  17.  
  18. const int INF = (int)1e18;
  19. const int md = (int)1e9 + 7;
  20. const int MAXN = (int)1e6 + 11;
  21. const int N = (int)1e5 + 11;
  22. const int debug = 0;
  23. const long double eps = 1e-7;
  24.  
  25. typedef tree<
  26. int,
  27. null_type,
  28. less_equal<int>,
  29. rb_tree_tag,
  30. tree_order_statistics_node_update>
  31. ordered_set;
  32.  
  33. int bpow(int a,int b){
  34.     if(b == 0)
  35.         return 1ll;
  36.     if(b % 2 == 0){
  37.         int t = bpow(a,b/2);
  38.         return (t * t) % md;
  39.     }
  40.     return (a * bpow(a,b-1)) % md;
  41. }
  42.  
  43. int inv(int a){ /// return 1/a by PRIME modulo md
  44.     return bpow(a,md-2);
  45. }
  46.  
  47. void myerase(ordered_set& st, int t){
  48.     int r = st.order_of_key(t);
  49.     ordered_set::iterator it = st.find_by_order(r);
  50.     st.erase(it);
  51.     return;
  52. }
  53.  
  54. mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
  55.  
  56. void init(){
  57.     return;
  58. }
  59.  
  60. struct DSU{
  61.     int n;
  62.     vector<int> parent;
  63.     void init(int sz){
  64.         n = sz;
  65.         parent.resize(n+1);
  66.         for(int i = 0; i <= n; i++)
  67.             parent[i] = i;
  68.         return;
  69.     }
  70.     int find_parent(int x){
  71.         if(parent[x] == x)
  72.             return x;
  73.         return parent[x] = find_parent(parent[x]);
  74.     }
  75.     void union_sets(int a,int b){
  76.         a = find_parent(a);
  77.         b = find_parent(b);
  78.         if(a == b)
  79.             return;
  80.         if(rnd() % 2)
  81.             parent[a] = b;
  82.         else
  83.             parent[b] = a;
  84.         return;
  85.     }
  86.     bool connected(int a,int b){
  87.         return find_parent(a) == find_parent(b);
  88.     }
  89. };
  90.  
  91. void solve_case(){
  92.     int n;
  93.     cin >> n;
  94.  
  95.     vector<pair<int,pair<int,int>>> v;
  96.     int g[n+1][n+1];
  97.     for(int i = 1; i <= n; i++){
  98.         for(int j = 1; j <= n; j++){
  99.             cin >> g[i][j];
  100.             v.pb(mp(g[i][j],mp(i,j)));
  101.         }
  102.     }
  103.  
  104.     sort(v.rbegin(),v.rend());
  105.     int sz = n - 1;
  106.     int a,b;
  107.     vector<pair<int,pair<int,int>>> G;
  108.     for(int i = 0; i < sz; i++){
  109.         cin >> a >> b;
  110.         G.pb(mp(g[a][b],mp(a,b)));
  111.     }
  112.  
  113.     sort(G.rbegin(),G.rend());
  114.     DSU d[2];
  115.     d[0].init(n+1);
  116.     d[1].init(n+1);
  117.     vector<pair<int,int>> ans;
  118.     for(int i = 0; i < sz; i++){
  119.         if(i < sz / 2){
  120.             d[0].union_sets(G[i].second.first,G[i].second.second);
  121.             ans.pb(mp(G[i].second.first,G[i].second.second));
  122.         } else {
  123.             d[1].union_sets(G[i].second.first,G[i].second.second);
  124.         }
  125.     }
  126.  
  127.     for(int i = 0; i < v.size(); i++){
  128.         int x = v[i].second.first, y = v[i].second.second;
  129.         if(d[0].connected(x,y) || d[1].connected(x,y))
  130.             continue;
  131.         d[0].union_sets(x,y);
  132.         d[1].union_sets(x,y);
  133.         ans.pb(mp(x,y));
  134.     }
  135.  
  136.     if(ans.size() != sz){
  137.         cout << "-1";
  138.         return;
  139.     }
  140.  
  141.     for(int i = 0; i < ans.size(); i++){
  142.         cout << ans[i].first << " " << ans[i].second << "\n";
  143.     }
  144.  
  145.     return;
  146. }
  147.  
  148. signed main(){
  149.     ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  150.     freopen("treexor.in","r",stdin);
  151.     freopen("treexor.out","w",stdout);
  152.  
  153.     init();
  154.  
  155.     int tests = 1;
  156. //    cin >> tests;
  157.  
  158.     for(int _ = 1; _ <= tests; _++){
  159.         solve_case();
  160.     }
  161.  
  162.     return 0;
  163. }
  164.  
  165. /*
  166.  
  167.  
  168. */
  169.  
Advertisement
Add Comment
Please, Sign In to add comment