Advertisement
Guest User

J Exhibition

a guest
Aug 19th, 2013
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2.  
  3. #include <iostream>
  4. #include <math.h>
  5. #include <string.h>
  6. #include <string>
  7. #include <cmath>
  8. #include <stdio.h>
  9. #include <vector>
  10. #include <map>
  11. #include <list>
  12. #include <queue>
  13. #include <functional>
  14. #include <algorithm>
  15. #include <bitset>
  16. #include <set>
  17. #include <stack>
  18.  
  19. using namespace std;
  20.  
  21. #define y1 y12345
  22.  
  23. #define REP(i,n) for(long long int i = 0; i < int(n); ++i)
  24. #define REPV(i, n) for (long long int i = (n) - 1; (int)i >= 0; --i)
  25. #define FOR(i, a, b) for(long long int i = (int)(a); i < (int)(b); ++i)
  26.  
  27. #define ALL(v) (v).begin(), (v).end()
  28. #define PF push_front
  29. #define PB push_back
  30. #define MP make_pair
  31. #define F first
  32. #define S second
  33.  
  34. #define lli long long int
  35.  
  36. int N = 500;
  37.  
  38. int n, m;
  39.  
  40. struct Progression {
  41.     lli a, b;
  42.     int index;
  43.     vector<int> members;
  44.  
  45.     void generate() {
  46.         if (a <= 0 && b <= 0) return;
  47.         if (a == 0) {
  48.             if (b <= m) members.push_back(b);
  49.         } else if (a < 0) {
  50.             if (b <= m) members.push_back(b);
  51.             lli k = (-b)/(a);
  52.             int i = 0;
  53.             while (i < N) {
  54.                 lli x = a*k + b;
  55.                 if (x > 0 && x <= m && k >=0 ) members.push_back(x);
  56.                 ++i; --k;
  57.             }
  58.         } else if (b <= 0) {
  59.             lli k = (-b)/a;
  60.             int i = 0;
  61.             while (i < N) {
  62.                 lli x = a*k + b;
  63.                 if (x > 0 && x <= m && k >=0 ) members.push_back(x);
  64.                 ++i; ++k;
  65.             }
  66.         } else {
  67.             for(int i = 0; i < N; ++i) {
  68.                 lli x = a*i + b;
  69.                 if (x <= m) members.push_back(x);
  70.                 else break;
  71.             }
  72.         }
  73.     }
  74. };
  75.  
  76. Progression progressions[302];
  77.  
  78. map<int, int> matching;
  79. bool used[302];
  80.  
  81. bool dfs(int v) {
  82.     if (used[v]) return false;
  83.     used[v] = true;
  84.     for(int i = 0; i < progressions[v].members.size(); ++i) {
  85.         int to = progressions[v].members[i];
  86.         map<int, int>::iterator it = matching.find(to);
  87.         if (it == matching.end() || dfs((*it).second)) {
  88.             matching[to] = v;
  89.             return true;
  90.         }
  91.     }
  92.     return false;
  93. }
  94.  
  95. int ans[305];
  96. bool usedM[1000];
  97. int k = 1;
  98.  
  99. int getFirst() {
  100.     while (usedM[k]) ++k;
  101.     usedM[k] = true;
  102.     return k;
  103. }
  104.  
  105. int main()
  106. {
  107. ios_base::sync_with_stdio(0);
  108. #ifdef FILE_IO
  109.     freopen("input.txt", "r", stdin);
  110.     freopen("output.txt", "w", stdout);
  111. #endif  
  112.     cin >> n >> m;    
  113.     REP(i, n) {
  114.         cin >> progressions[i].a >> progressions[i].b;
  115.         progressions[i].generate();
  116.     }
  117.     REP(i, n) {
  118.         memset(used, 0, 302*sizeof(bool));
  119.         dfs(i);
  120.     }
  121.     for(map<int, int>::iterator i = matching.begin(); i != matching.end(); ++i) {
  122.         int value = (*i).first;
  123.         ans[(*i).second] = value;
  124.         if (value < 1000) usedM[value] = true;
  125.     }
  126.     for(int i = 0; i < n; ++i) {
  127.         cout << (ans[i] != 0 ? ans[i] : getFirst()) << " ";
  128.     }
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement