Advertisement
RaFiN_

max match solution print

Mar 28th, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.06 KB | None | 0 0
  1. ///#include <stdio.h>
  2. ///#include <iostream>
  3. ///#include <cstring>
  4. ///#include <cmath>
  5. ///#include <algorithm>
  6. ///#include <string>
  7. ///#include <vector>
  8. ///#include <map>
  9. ///#include <set>
  10. ///#include <queue>
  11. ///#include <cstdlib>
  12. ///#include <limits>
  13. ///#include <iostream>
  14. ///#include <sstream>
  15. ///#include <unordered_set>
  16. ///#include <unordered_map>
  17. ///#include <random>
  18. #include <bits/stdc++.h>
  19. ///#include <ext/pb_ds/assoc_container.hpp>
  20. ///#include <ext/pb_ds/tree_policy.hpp>
  21. using namespace std;
  22. ///using namespace __gnu_pbds;
  23.  
  24. #define              MAX             100005
  25. #define              EPS             1e-9
  26. #define              ull             unsigned long long
  27. #define              ll              long long
  28. #define              inf             INT_MAX
  29. #define              pi              acos(-1.0)
  30. #define              vi              vector<int>
  31. #define              vl              vector<long long>
  32. #define              pii             pair<int,int>
  33. #define              pll             pair<long long,long long>
  34. #define              mp              make_pair
  35. #define              mem(a, v)       memset(a, v, sizeof (a))
  36. #define              mod             1000000007
  37. #define              all(a)          a.begin(),a.end()
  38. #define              rall(a)         a.rbegin(),a.rend()
  39. #define              ff              first
  40. #define              ss              second
  41. #define              arsort(ar,n)    sort(ar,ar+n);
  42. #define              vsort(v)        sort(v.begin(),v.end())
  43. #define              vrev(v)         reverse(v.begin(),v.end())
  44. #define              arrev(ar,n)     reverse(ar,ar+n)
  45. #define              pb              push_back
  46. #define              popb            pop_back
  47. #define              booster()       ios_base::sync_with_stdio(0); cin.tie(0);
  48. #define              read(f)         freopen(f, "r", stdin)
  49. #define              scani(x)        scanf("%d",&x)
  50. #define              scanl(x)        scanf("%lld",&x)
  51. #define              scand(x)        scanf("%lf",&x)
  52. #define              scans(x)        scanf("%s",x)
  53. #define              min3(a,b,c)     min(a,min(b,c))
  54. #define              max3(a,b,c)     max(a,max(b,c))
  55. #define              min4(a,b,c,d)   min(min(a,b),min(c,d))
  56. #define              max4(a,b,c,d)   max(max(a,b),max(c,d))
  57. #define              max5(a,b,c,d,e) max(max3(a,b,c),max(d,e))
  58. #define              min5(a,b,c,d,e) min(min3(a,b,c),min(d,e))
  59.  
  60. #define              bitCheck(a,k)     ((bool)(a&(1<<(k))))
  61. #define              bitOff(a,k)       (a&(~(1<<(k))))
  62. #define              bitOn(a,k)        (a|(1<<(k)))
  63. #define              bitFlip(a,k)      (a^(1<<(k)))
  64.  
  65. #define              POPCOUNT           __builtin_popcount
  66. #define              POPCOUNTLL         __builtin_popcountll
  67. #define              RIGHTMOST          __builtin_ctzll
  68. #define              LEFTMOST(x)        (63-__builtin_clzll((x)))
  69.  
  70. #define scani2(a,b) scani(a) , scani(b)
  71. #define scani3(a,b,c) scani(a), scani(b), scani(c)
  72. #define scani4(a,b,c,d) scani(a), scani(b), scani(c), scani(d)
  73. #define scani5(a,b,c,d,e) scani(a), scani(b), scani(c), scani(d) , scani(e)
  74.  
  75.  
  76. ///typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;///*X.find_by_order();X.order_of_key();
  77. template <class T> inline bool isLeap(T y) {return (y % 400 == 0) || (y % 100 ? y % 4 == 0 : false); }
  78. template< class T > inline T gcd(T a, T b) { return (b) == 0 ? (a) : gcd((b), ((a) % (b))); }
  79. template< class T > inline T lcm(T a, T b) { return ((a) / gcd((a), (b)) * (b)); }
  80. template <class T> inline T BigMod(T Base,T power,T M=mod){if(power==0)return 1;if(power&1)return ((Base%M)*(BigMod(Base,power-1,M)%M))%M;else{T y=BigMod(Base,power/2,M)%M;return (y*y)%M;}}
  81. template <class T> inline T ModInv (T A,T M = mod){return BigMod(A,M-2,M);}
  82.  
  83. int fx[] = {-1,+0,+1,+0,+1,+1,-1,-1,+0};
  84. int fy[] = {+0,-1,+0,+1,+1,-1,+1,-1,+0};
  85. int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  86.  
  87.  
  88.  
  89. const int MAXN1 = 50000;
  90. const int MAXN2 = 50000;
  91. const int MAXM = 150000;
  92.  
  93. int n1, n2, edges, last[MAXN1], prv[MAXM], head[MAXM];
  94. int matching[MAXN2], dist[MAXN1], Q[MAXN1];
  95. bool used[MAXN1], vis[MAXN1];
  96.  
  97. void init(int _n1, int _n2) {
  98.     n1 = _n1;
  99.     n2 = _n2;
  100.     edges = 0;
  101.     fill(last, last + n1, -1);
  102. }
  103.  
  104. void addEdge(int u, int v) {
  105.     head[edges] = v;
  106.     prv[edges] = last[u];
  107.     last[u] = edges++;
  108. }
  109.  
  110. void bfs() {
  111.     fill(dist, dist + n1, -1);
  112.     int sizeQ = 0;
  113.     for (int u = 0; u < n1; ++u) {
  114.         if (!used[u]) {
  115.             Q[sizeQ++] = u;
  116.             dist[u] = 0;
  117.         }
  118.     }
  119.     for (int i = 0; i < sizeQ; i++) {
  120.         int u1 = Q[i];
  121.         for (int e = last[u1]; e >= 0; e = prv[e]) {
  122.             int u2 = matching[head[e]];
  123.             if (u2 >= 0 && dist[u2] < 0) {
  124.                 dist[u2] = dist[u1] + 1;
  125.                 Q[sizeQ++] = u2;
  126.             }
  127.         }
  128.     }
  129. }
  130.  
  131. bool dfs(int u1) {
  132.     vis[u1] = true;
  133.     for (int e = last[u1]; e >= 0; e = prv[e]) {
  134.         int v = head[e];
  135.         int u2 = matching[v];
  136.         if (u2 < 0 || !vis[u2] && dist[u2] == dist[u1] + 1 && dfs(u2)) {
  137.             matching[v] = u1;
  138.             used[u1] = true;
  139.             return true;
  140.         }
  141.     }
  142.     return false;
  143. }
  144.  
  145. int maxMatching() {
  146.     fill(used, used + n1, false);
  147.     fill(matching, matching + n2, -1);
  148.     for (int res = 0;;) {
  149.         bfs();
  150.         fill(vis, vis + n1, false);
  151.         int f = 0;
  152.         for (int u = 0; u < n1; ++u)
  153.             if (!used[u] && dfs(u))
  154.                 ++f;
  155.         if (!f)
  156.             return res;
  157.         res += f;
  158.     }
  159. }
  160.  
  161. int arr1[200],arr2[200];
  162.  
  163.  
  164. /*********************** let the play begin() ***********************************/
  165.  
  166. int main()
  167. {
  168.     booster()
  169.    /// read("input.txt");
  170.  
  171.     int t;
  172.     scani(t);
  173.     int ajinka=1;
  174.     while(t--)
  175.     {
  176.  
  177.  
  178.         init(500, 500);
  179.  
  180.         int n,m;
  181.         scani(n);
  182.         int arr[n+5];
  183.         for(int i=0;i<n;i++)scani(arr[i]);
  184.         sort(arr,arr+n);
  185.         int x=unique(arr,arr+n)-arr;
  186.         for(int i=0;i<x;i++)for(int j=i+1;j<x;j++)if(arr[j]%arr[i]==0)addEdge(i,j);
  187.         int mis=x-maxMatching();int prr[n+5];vi ans;mem(prr,0);
  188.         for(int i=0;i<x;i++)
  189.         {
  190.  
  191.             if(prr[i])continue;
  192.             vi pk;
  193.  
  194.             pk.pb(arr[i]);
  195.             for(int j=i+1;j<x;j++)
  196.             {
  197.                 if(prr[j]==0&&arr[j]%arr[i]!=0) pk.pb(arr[j]);
  198.             }
  199.             init(300,300);
  200.             int mnt = 0;
  201.             for(int j=0;j<pk.size();j++)for(int k=j+1;k<pk.size();k++)if(pk[k]%pk[j]==0)addEdge(j,k);
  202.  
  203.             int gg = ans.size() + pk.size() - maxMatching();
  204.  
  205.             ///cout<<gg<<" "<<arr[i]<<endl;
  206.             if (gg == mis)
  207.             {
  208.                 ans.pb(arr[i]);
  209.                 for(int j=i+1;j<x;j++)if(arr[j]%arr[i]==0)prr[j]=1;
  210.             }
  211.         }
  212.         printf("Case %d: ",ajinka++);
  213.         for(int j=0;j<ans.size();j++)
  214.         {
  215.             printf("%d",ans[j]);
  216.             if(j<ans.size()-1)printf(" ");
  217.  
  218.         }
  219.         printf("\n");
  220.     }
  221.  
  222.  
  223.  
  224.  
  225.  
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement