rembocoder

Untitled

Apr 13th, 2023
878
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define int int64_t
  6.  
  7. const int inf = 2e18;
  8. const int mod = 1e9 + 7;
  9. const int max_n = 30;
  10.  
  11. bool g[max_n][max_n];
  12. bool chosen[max_n];
  13. vector<int> best;
  14. vector<int> inds;
  15. int covered_mask = 0;
  16.  
  17. map<pair<int, int>, int> memoi; // i, covered_mask -> min known number of chosen
  18.  
  19. void rec(int i, int n) {
  20.     pair<int, int> key = {i, covered_mask};
  21.     if (memoi.find(key) != memoi.end() && memoi[key] <= inds.size()) {
  22.         return;
  23.     }
  24.     memoi[key] = inds.size();
  25.     if (inds.size() >= best.size()) {
  26.         return;
  27.     }
  28.     if (i == n) {
  29.         if (best.size() > inds.size()) {
  30.             best = inds;
  31.         }
  32.         return;
  33.     }
  34.     bool must_choose = false;
  35.     for (int j = 0; j < n; j++) {
  36.         if (!g[i][j]) {
  37.             continue;
  38.         }
  39.         bool covered = false;
  40.         for (int k = 0; k < i; k++) {
  41.             if (chosen[k] && g[k][j]) {
  42.                 covered = true;
  43.             }
  44.         }
  45.         if (covered) {
  46.             continue;
  47.         }
  48.         bool can_be = false;
  49.         for (int k = i + 1; k < n; k++) {
  50.             if (g[k][j]) {
  51.                 can_be = true;
  52.             }
  53.         }
  54.         if (!can_be) {
  55.             must_choose = true;
  56.         }
  57.     }
  58.     if (!must_choose) {
  59.         rec(i + 1, n);
  60.     }
  61.     vector<int> new_covered;
  62.     for (int j = 0; j < n; j++) {
  63.         if (!g[i][j]) {
  64.             continue;
  65.         }
  66.         if ((covered_mask & (1 << j)) == 0) {
  67.             new_covered.push_back(j);
  68.         }
  69.     }
  70.     if (new_covered.size() > 0) {
  71.         inds.push_back(i);
  72.         chosen[i] = true;
  73.         for (int j: new_covered) {
  74.             covered_mask |= 1 << j;
  75.         }
  76.         rec(i + 1, n);
  77.         for (int j: new_covered) {
  78.             covered_mask -= 1 << j;
  79.         }
  80.         chosen[i] = false;
  81.         inds.pop_back();
  82.     }
  83. }
  84.  
  85. int32_t main() {
  86.     ios_base::sync_with_stdio(0);
  87.     cin.tie(0); cout.tie(0);
  88.     int n, r;
  89.     cin >> n >> r;
  90.     vector<int> x(n);
  91.     vector<int> y(n);
  92.     for (int i = 0; i < n; i++) {
  93.         cin >> x[i] >> y[i];
  94.     }
  95.     for (int i = 0; i < n; i++) {
  96.         for (int j = 0; j < n; j++) {
  97.             g[i][j] = (x[i] - x[j]) * (x[i] - x[j]) +
  98.                       (y[i] - y[j]) * (y[i] - y[j]) <= r * r;
  99.         }
  100.     }
  101.     for (int i = 0; i < n; i++) {
  102.         best.push_back(i);
  103.     }
  104.     rec(0, n);
  105.     cout << best.size() << '\n';
  106.     for (int i: best) {
  107.         cout << i + 1 << ' ';
  108.     }
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment