Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker,"/STACK:134217728")
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <map>
- #include <set>
- #include <queue>
- #include <algorithm>
- #include <cstring>
- #include <string>
- using namespace std;
- int res, resMask, final, taken[30], sz, canCoverAfter[32], n, m[32];
- void go(int p, int covered){
- if (sz>=res) return;
- if (covered == final){
- if (sz<res){
- res=sz;
- resMask=0;
- for (int i=0; i<sz; ++i) resMask |= (1<<taken[i]);
- }
- return;
- }
- if (p==n) return;
- if ((canCoverAfter[p]|covered) != final){
- // Must take because it can't be covered later
- taken[sz++]=p;
- go(p+1,covered|m[p]);
- --sz;
- } else {
- // Don't take
- go(p+1,covered);
- // Take
- taken[sz++]=p;
- go(p+1,covered|m[p]);
- --sz;
- }
- }
- int main(){
- #ifdef KP_HOME
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- #endif
- int r, x[31], y[31];
- scanf("%d%d",&n,&r);
- for (int i=0; i<n; ++i){
- scanf("%d%d",&x[i],&y[i]);
- }
- for (int i=0; i<n; ++i){
- m[i]=0;
- for (int j=0; j<n;++j) if ((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]) <= r*r) m[i] |= (1<<j);
- }
- m[n]=0;
- for (int i=n-1; i>=0; --i){
- canCoverAfter[i]=canCoverAfter[i+1] | m[i+1];
- }
- sz=0;
- final=(1<<n)-1;
- res=n+1;
- go(0,0);
- printf("%d\n",res);
- for (int i=0; i<n; ++i) if (resMask&(1<<i)) printf("%d ",i+1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement