Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int int64_t
- const int inf = 2e18;
- const int mod = 1e9 + 7;
- const int max_n = 30;
- bool g[max_n][max_n];
- bool chosen[max_n];
- vector<int> best;
- vector<int> inds;
- int covered_mask = 0;
- map<pair<int, int>, int> memoi; // i, covered_mask -> min known number of chosen
- void rec(int i, int n) {
- pair<int, int> key = {i, covered_mask};
- if (memoi.find(key) != memoi.end() && memoi[key] <= inds.size()) {
- return;
- }
- memoi[key] = inds.size();
- if (inds.size() >= best.size()) {
- return;
- }
- if (i == n) {
- if (best.size() > inds.size()) {
- best = inds;
- }
- return;
- }
- bool must_choose = false;
- for (int j = 0; j < n; j++) {
- if (!g[i][j]) {
- continue;
- }
- bool covered = false;
- for (int k = 0; k < i; k++) {
- if (chosen[k] && g[k][j]) {
- covered = true;
- }
- }
- if (covered) {
- continue;
- }
- bool can_be = false;
- for (int k = i + 1; k < n; k++) {
- if (g[k][j]) {
- can_be = true;
- }
- }
- if (!can_be) {
- must_choose = true;
- }
- }
- if (!must_choose) {
- rec(i + 1, n);
- }
- vector<int> new_covered;
- for (int j = 0; j < n; j++) {
- if (!g[i][j]) {
- continue;
- }
- if ((covered_mask & (1 << j)) == 0) {
- new_covered.push_back(j);
- }
- }
- if (new_covered.size() > 0) {
- inds.push_back(i);
- chosen[i] = true;
- for (int j: new_covered) {
- covered_mask |= 1 << j;
- }
- rec(i + 1, n);
- for (int j: new_covered) {
- covered_mask -= 1 << j;
- }
- chosen[i] = false;
- inds.pop_back();
- }
- }
- int32_t main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0); cout.tie(0);
- int n, r;
- cin >> n >> r;
- vector<int> x(n);
- vector<int> y(n);
- for (int i = 0; i < n; i++) {
- cin >> x[i] >> y[i];
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- g[i][j] = (x[i] - x[j]) * (x[i] - x[j]) +
- (y[i] - y[j]) * (y[i] - y[j]) <= r * r;
- }
- }
- for (int i = 0; i < n; i++) {
- best.push_back(i);
- }
- rec(0, n);
- cout << best.size() << '\n';
- for (int i: best) {
- cout << i + 1 << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment