fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct Point
  5. {
  6. int id;
  7. int x, y;
  8. };
  9.  
  10. int n;
  11. long long kc;
  12. vector<Point> p;
  13.  
  14. vector<vector<bool>> adjbt;
  15. int msz = 0;
  16. bool cbt[25];
  17.  
  18. void sbt(int k, int cursz)
  19. {
  20. if (k == n)
  21. {
  22. msz = max(msz, cursz);
  23. return;
  24. }
  25. sbt(k + 1, cursz);
  26. bool able = true;
  27. for (int i = 0; i < k; ++i)
  28. {
  29. if (cbt[i] && adjbt[i][k])
  30. {
  31. able = false;
  32. break;
  33. }
  34. }
  35. if (able)
  36. {
  37. cbt[k] = true;
  38. sbt(k + 1, cursz + 1);
  39. cbt[k] = false;
  40. }
  41. }
  42.  
  43. const int MAXN = 10005;
  44. vector<int> adj[MAXN];
  45. int ghep[MAXN];
  46. bool visited[MAXN];
  47. int color[MAXN];
  48.  
  49. bool dfs(int u)
  50. {
  51. if (visited[u]) return false;
  52. visited[u] = true;
  53. for (int v : adj[u])
  54. {
  55. if (ghep[v] < 0 || dfs(ghep[v]))
  56. {
  57. ghep[v] = u;
  58. return true;
  59. }
  60. }
  61. return false;
  62. }
  63. void bfs(int start_node, const vector<Point>& gnode)
  64. {
  65. color[start_node] = 1;
  66. queue<int> q;
  67. q.push(start_node);
  68.  
  69. while (!q.empty())
  70. {
  71. int u = q.front();
  72. q.pop();
  73.  
  74. for (int v : adj[u])
  75. {
  76. if (color[v] == 0)
  77. {
  78. color[v] = 3 - color[u];
  79. q.push(v);
  80. }
  81. }
  82. }
  83. }
  84. int cal(const vector<Point>& gnode)
  85. {
  86. if (gnode.empty()) return 0;
  87. for(const auto& p : gnode) color[p.id] = 0;
  88. for (const auto& p : gnode)
  89. {
  90. if (color[p.id] == 0)
  91. {
  92. bfs(p.id, gnode);
  93. }
  94. }
  95. vector<int> gru;
  96. for (const auto& p : gnode)
  97. {
  98. if (color[p.id] == 1)
  99. {
  100. gru.push_back(p.id);
  101. }
  102. }
  103. int ghepsz = 0;
  104. memset(ghep, -1, sizeof(ghep));
  105. for (int u : gru)
  106. {
  107. memset(visited, false, sizeof(visited));
  108. if (dfs(u))
  109. {
  110. ghepsz++;
  111. }
  112. }
  113. return ghepsz;
  114. }
  115.  
  116.  
  117. int main()
  118. {
  119. ios::sync_with_stdio(0);
  120. cin.tie(0);
  121. cout.tie(0);
  122.  
  123. if(fopen("cd.inp","r"))
  124. {
  125. freopen("cd.inp","r",stdin);
  126. freopen("cd.out","w",stdout);
  127. }
  128.  
  129. int d_int;
  130. cin >> n >> d_int;
  131. kc = (long long)d_int * d_int;
  132. p.resize(n);
  133. for (int i = 0; i < n; ++i)
  134. {
  135. p[i].id = i;
  136. cin >> p[i].x >> p[i].y;
  137. }
  138.  
  139. if (n <= 22)
  140. {
  141. adjbt.assign(n, vector<bool>(n, false));
  142. for (int i = 0; i < n; ++i)
  143. {
  144. for (int j = i + 1; j < n; ++j)
  145. {
  146. long long dx = p[i].x - p[j].x;
  147. long long dy = p[i].y - p[j].y;
  148. if (dx * dx + dy * dy == kc)
  149. {
  150. adjbt[i][j] = adjbt[j][i] = true;
  151. }
  152. }
  153. }
  154. sbt(0, 0);
  155. cout << n - msz << endl;
  156. }
  157. else
  158. {
  159. int res = 0;
  160. if (kc % 2 != 0)
  161. {
  162. vector<Point> chan, le;
  163. for (const auto& p : p)
  164. {
  165. adj[p.id].clear();
  166. if ((p.x + p.y) % 2 == 0) chan.push_back(p);
  167. else le.push_back(p);
  168. }
  169. for (const auto& u : chan)
  170. {
  171. for (const auto& v : le)
  172. {
  173. long long dx = u.x - v.x;
  174. long long dy = u.y - v.y;
  175. if (dx * dx + dy * dy == kc)
  176. {
  177. adj[u.id].push_back(v.id);
  178. adj[v.id].push_back(u.id);
  179. }
  180. }
  181. }
  182. res = cal(p);
  183. }
  184. else
  185. {
  186. vector<Point> chan, le;
  187. for (const auto& p : p)
  188. {
  189. adj[p.id].clear();
  190. if ((p.x + p.y) % 2 == 0) chan.push_back(p);
  191. else le.push_back(p);
  192. }
  193. for (size_t i = 0; i < chan.size(); ++i)
  194. {
  195. for (size_t j = i + 1; j < chan.size(); ++j)
  196. {
  197. Point u = chan[i], v = chan[j];
  198. long long dx = u.x - v.x;
  199. long long dy = u.y - v.y;
  200. if (dx * dx + dy * dy == kc)
  201. {
  202. adj[u.id].push_back(v.id);
  203. adj[v.id].push_back(u.id);
  204. }
  205. }
  206. }
  207. res += cal(chan);
  208. for (size_t i = 0; i < le.size(); ++i)
  209. {
  210. for (size_t j = i + 1; j < le.size(); ++j)
  211. {
  212. Point u = le[i], v = le[j];
  213. long long dx = u.x - v.x;
  214. long long dy = u.y - v.y;
  215. if (dx * dx + dy * dy == kc)
  216. {
  217. adj[u.id].push_back(v.id);
  218. adj[v.id].push_back(u.id);
  219. }
  220. }
  221. }
  222. res += cal(le);
  223. }
  224. cout << res << endl;
  225. }
  226. return 0;
  227. }
  228.  
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
0