Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <utility>
  6. #include <queue>
  7. #include <cstdlib>
  8. #include <ctime>
  9. #include <time.h>
  10. #include<windows.h>
  11. using namespace std;
  12.  
  13. const int MAXN = 1<<14;
  14.  
  15. int i_rand = 0;
  16. int i_sum = 0;
  17. int i_rang = 0;
  18.  
  19. int parent[MAXN];
  20. int rang[MAXN];
  21. int sum[MAXN];
  22.  
  23. void make_set(int v) {
  24.     parent[v] = v;
  25.     rang[v] = 1;
  26.     sum[v] = 1;
  27. }
  28.  
  29. int find_set(int v) {
  30.     i_rand++;
  31.     i_rang++;
  32.     i_sum++;
  33.     if (v == parent[v])
  34.         return v;
  35.     return parent[v] = find_set(parent[v]);
  36. }
  37.  
  38. void union_sets_random(int a, int b) {
  39.     a = find_set(a);
  40.     b = find_set(b);
  41.     if (a == b) {
  42.         return;
  43.     }
  44.     srand(b);
  45.     int random = rand() % 2;
  46.     if (random == 0) {
  47.         parent[a] = b;
  48.     }
  49.     else {
  50.         parent[b] = a;
  51.     }
  52. }
  53.  
  54. void union_sets_rang(int a, int b) {
  55.     a = find_set(a);
  56.     b = find_set(b);
  57.     if (a == b) {
  58.         return;
  59.     }
  60.     if (rang[a] < rang[b]) {
  61.         swap(a, b);
  62.     }
  63.     parent[b] = a;
  64.     if (rang[a] == rang[b]) {
  65.         rang[a]++;
  66.     }
  67. }
  68.  
  69. void union_sets_sum(int a, int b) {
  70.     a = find_set(a);
  71.     b = find_set(b);
  72.     if (a == b) {
  73.         return;
  74.     }
  75.     if (sum[a] < sum[b]) {
  76.         swap(a, b);
  77.     }
  78.     parent[b] = a;
  79.     sum[a] += sum[b];
  80. }
  81.  
  82.  
  83. void random_inp(int n) {
  84.     srand(1234567);
  85.     i_rand = 0;
  86.     i_rang = 0;
  87.     i_sum = 0;
  88.     for (size_t i = 0; i < MAXN; ++i) {
  89.         make_set(i);
  90.     }
  91.     for (size_t i = 0; i < n; ++i) {
  92.         int x = rand() % MAXN, y = rand() % MAXN;
  93.         x = find_set(x);
  94.         y = find_set(y);
  95.         union_sets_random(x, y);
  96.     }
  97.     cout << "random na randome " << i_rand << "\n";
  98.     i_rand = 0;
  99.     i_rang = 0;
  100.     i_sum = 0;
  101.     srand(134567);
  102.     for (size_t i = 0; i < MAXN; ++i) {
  103.         make_set(i);
  104.     }
  105.     for (size_t i = 0; i < n; ++i) {
  106.         int x = rand() % MAXN, y = rand() % MAXN;
  107.         x = find_set(x);
  108.         y = find_set(y);
  109.         union_sets_sum(x, y);
  110.     }
  111.     cout << "random na summe " << i_sum << "\n";
  112.     i_rand = 0;
  113.     i_rang = 0;
  114.     i_sum = 0;
  115.     srand(123457);
  116.     for (size_t i = 0; i < MAXN; ++i) {
  117.         make_set(i);
  118.     }
  119.     for (size_t i = 0; i < n; ++i) {
  120.         int x = rand() % MAXN, y = rand() % MAXN;
  121.         x = find_set(x);
  122.         y = find_set(y);
  123.         union_sets_rang(x, y);
  124.     }
  125.     cout << "random na visote " << i_rang << "\n";
  126. }
  127.  
  128. void small_to_big() {
  129.     i_rand = 0;
  130.     i_rang = 0;
  131.     i_sum = 0;
  132.     for (size_t i = 0; i < MAXN; ++i) {
  133.         make_set(i);
  134.     }
  135.     for (size_t i = 1; i < MAXN; ++i) {
  136.         int x = 0, y = i;
  137.         x = find_set(x);
  138.         y = find_set(y);
  139.         union_sets_random(x, y);
  140.     }
  141.     cout << "small_to_big na randome " << i_rand << "\n";
  142.     i_rand = 0;
  143.     i_rang = 0;
  144.     i_sum = 0;
  145.     for (size_t i = 0; i < MAXN; ++i) {
  146.         make_set(i);
  147.     }
  148.     for (size_t i = 1; i < MAXN; ++i) {
  149.         int x = 0, y = i;
  150.         x = find_set(x);
  151.         y = find_set(y);
  152.         union_sets_sum(x, y);
  153.     }
  154.     cout << "small_to_big na summe " << i_sum << "\n";
  155.     i_rand = 0;
  156.     i_rang = 0;
  157.     i_sum = 0;
  158.     for (size_t i = 0; i < MAXN; ++i) {
  159.         make_set(i);
  160.     }
  161.     for (size_t i = 1; i < MAXN; ++i) {
  162.         int x = 0, y = i;
  163.         x = find_set(x);
  164.         y = find_set(y);
  165.         union_sets_rang(x, y);
  166.     }
  167.     cout << "small_to_big na visote " << i_rang << "\n";
  168. }
  169.  
  170. vector<pair<int, int> > q;
  171.  
  172. void merge(int l) {
  173.     if (l > MAXN) {
  174.         return;
  175.     }
  176.     for (size_t i = 0; i < MAXN-l+1; i = i + l) {
  177.         q.push_back({ i, i + l - 1 });
  178.     }
  179.     merge(l * 2);
  180. }
  181.  
  182. void equal_to_equal() {
  183.     i_rand = 0;
  184.     i_rang = 0;
  185.     i_sum = 0;
  186.     for (size_t i = 0; i < MAXN; ++i) {
  187.         make_set(i);
  188.     }
  189.     for (size_t i = 1; i < q.size(); ++i) {
  190.         int x = q[i].first, y = q[i].second;
  191.         x = find_set(x);
  192.         y = find_set(y);
  193.         union_sets_random(x, y);
  194.     }
  195.     cout << "equal in random " << i_rand << "\n";
  196.     i_rand = 0;
  197.     i_rang = 0;
  198.     i_sum = 0;
  199.     for (size_t i = 0; i < MAXN; ++i) {
  200.         make_set(i);
  201.     }
  202.     for (size_t i = 1; i < q.size(); ++i) {
  203.         int x = q[i].first, y = q[i].second;
  204.         x = find_set(x);
  205.         y = find_set(y);
  206.         union_sets_rang(x, y);
  207.     }
  208.     cout << "equal in rang " << i_rang << "\n";
  209.     i_rand = 0;
  210.     i_rang = 0;
  211.     i_sum = 0;
  212.     for (size_t i = 0; i < MAXN; ++i) {
  213.         make_set(i);
  214.     }
  215.     for (size_t i = 1; i < q.size(); ++i) {
  216.         int x = q[i].first, y = q[i].second;
  217.         x = find_set(x);
  218.         y = find_set(y);
  219.         union_sets_sum(x, y);
  220.     }
  221.     cout << "equal in sum " << i_sum << "\n";
  222. }
  223.  
  224.  
  225. int main() {
  226.     int n;
  227.     cin >> n;
  228.     cout << "Randomniy dannie\n";
  229.     random_inp(n);
  230.     cout << "\n\n\n";
  231.     cout << "One to big\n";
  232.     small_to_big();
  233.     cout << "\n\n\n";
  234.     merge(2);
  235.     cout << "Equal to equal\n";
  236.     equal_to_equal();
  237.     return 0;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement