Advertisement
Guest User

koncentracja

a guest
Dec 15th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <unordered_map>
  3. #include <vector>
  4. #include <set>
  5. #include <deque>
  6.  
  7. using namespace std;
  8.  
  9. #define SET_SIZE R - L + 1
  10. #define FOR(i, beg, end) for (i = beg; i < end; ++i)
  11. #define READ_VECT(vect, N) do {vect.resize(N); int iv = 0; FOR(iv, 0, N) {cin >> vect[iv];}} while(0)
  12. #define READ_BEG1(T) do {cin >> T;} while(0);
  13. #define READ_BEG2(T, K) do {cin >> T >> K;} while(0);
  14. #define READ_BEG3(T, K, M) do {cin >> T >> K >> M;} while(0);
  15. #define PRNTLN() do {cout << "\n";} while(0);
  16.  
  17. typedef pair<int, int> int_pair;
  18. using ll = long long;
  19. using long_boi = ll;
  20.  
  21. int N, D;
  22. vector<int_pair> points;
  23. vector<vector<bool>> other_set;
  24. vector<set<int>> s(2);
  25.  
  26. bool sol() {
  27.     vector<bool> visited(N);
  28.     vector<deque<int>> dfs(2);
  29.     bool set_nr = 0;
  30.     int i;
  31.     FOR (i, 0, N) {
  32.         if (visited[i]) {
  33.             continue;
  34.         }
  35.         set_nr = s[0].size() <= s[1].size() ? false : true;
  36.         s[set_nr].insert(i);
  37.         visited[i] = true;
  38.         dfs[set_nr].push_back(i);
  39.         while (!dfs[0].empty() || !dfs[1].empty()) {
  40.             while (!dfs[set_nr].empty()) {
  41.                 auto curr = dfs[set_nr].front();
  42.                 dfs[set_nr].pop_front();
  43.                 int j;
  44.                 FOR(j, 0, N) {
  45.                     if (other_set[curr][j]) {
  46.                         if (s[set_nr].find(j) != s[set_nr].end()) {
  47.                             return false;
  48.                         } else if (visited[j]) {
  49.                             continue;
  50.                         }
  51.                         dfs[!set_nr].push_back(j);
  52.                         s[!set_nr].insert(j);
  53.                         visited[j] = true;
  54.                     }
  55.                 }
  56.             }
  57.             set_nr = !set_nr;
  58.         }
  59.     }
  60.     return (s[0].size() != 0 && s[1].size() != 0);
  61. }
  62.  
  63. ll dist_sq (int_pair p1, int_pair p2) {
  64.     ll diff1 = (ll) p1.first - (ll) p2.first;
  65.     ll diff2 = (ll) p1.second - (ll) p2.second;
  66.     return diff1 * diff1 + diff2 * diff2;
  67. }
  68.  
  69. void print_set(set<int> secik) {
  70.     cout << secik.size() << " ";
  71.     for (auto &i: secik) {
  72.         cout << i + 1 << " ";
  73.     }
  74. }
  75.  
  76. int main() {
  77.     cin >> N >> D;
  78.     other_set.resize(N);
  79.     int i, j;
  80.     FOR(i, 0, N) {
  81.         int x, y;
  82.         cin >> x >> y;
  83.         points.emplace_back(x, y);
  84.         other_set[i].resize(N);
  85.     }
  86.     FOR(i, 0, N) {
  87.         FOR(j, 0, N) {
  88.             ll ds = dist_sq(points[i], points[j]);
  89.             if (ds > (ll) D * (ll) D) {
  90.                 other_set[i][j] = true;
  91.             }
  92.         }
  93.     }
  94.     if (!sol()) {
  95.         cout << "NIE";
  96.     }
  97.     else {
  98.         cout << "TAK" << "\n";
  99.         print_set(s[0]);
  100.         cout << "\n";
  101.         print_set(s[1]);
  102.     }
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement