#include #define pb push_back #define ll long long using namespace std; int N, K, FK, TS[100500], FS[100500], alg, s, cnt, Order[5005]; ll R, tx, ty; bool D[5005], TD[5005], ok; ll X[100500], Y[100500]; vector V[5005]; struct point { int order; ll x, y; }A[100500]; clock_t start, finish, tle; mt19937_64 rng; float Minkow_Power(ll x) { float ret = 1; for(int i = 1; i <= s; i++) ret = ret * float(x); return ret; } bool cmpx(point a, point b){return a.x < b.x;} bool cmpy(point a, point b){return a.y < b.y;} bool cmppit(point a, point b){return a.x * a.x + a.y * a.y < b.x * b.x + b.y * b.y;} bool cmpman(point a, point b){return a.x + a.y < b.x + b.y;} bool cmpmink(point a, point b){return Minkow_Power(a.x) + Minkow_Power(a.y) < Minkow_Power(b.x) + Minkow_Power(b.y);} bool cmpV(point a, point b){return V[a.order].size() < V[b.order].size();} void TEST_OUT() { printf("%d\n", K); for(int i = 1; i <= K; i++) printf("%d ", TS[i]); printf("\n"); } bool CHECK(ll x, ll y) { for(int i = 1; i <= K; i++) if((X[TS[i]] - x) * (X[TS[i]] - x) + (Y[TS[i]] - y) * (Y[TS[i]] - y) < R) return false; return true; } void KVCHECK(ll idx) { for(int i = 1; i <= N; i++) if((X[A[i].order] - X[idx]) * (X[A[i].order] - X[idx]) + (Y[A[i].order] - Y[idx]) * (Y[A[i].order] - Y[idx]) < R) { if(idx == A[i].order) continue; V[idx].push_back(A[i].order); } } void WORK() { K = 0; finish = clock(); if(finish - start > tle) return; TS[++K] = A[1].order; for(int i = 2; i <= N; i++) { int j = A[i].order; if(CHECK(X[j], Y[j])) TS[++K] = j; } if(K > FK) { TEST_OUT(); swap(TS, FS); FK = K; } } void REVWORK() { K = 0; finish = clock(); if(finish - start > tle) return; TS[++K] = A[N].order; for(int i = N - 1; i; i--) { int j = A[i].order; if(CHECK(X[j], Y[j])) TS[++K] = j; } if(K > FK) { TEST_OUT(); swap(TS, FS); FK = K; } } void KVADRAT() { sort(A + 1, A + N + 1, cmpV); WORK(); REVWORK(); } void SOLVE() { start = clock(); tle = 3.5 * CLOCKS_PER_SEC; if(N <= 5000) { for(int i = 1; i <= N; i++) KVCHECK(A[i].order); KVADRAT(); } WORK(); REVWORK(); sort(A + 1, A + N + 1, cmpx); WORK(); REVWORK(); sort(A + 1, A + N + 1, cmpy); WORK(); REVWORK(); for(int i = 1; i <= 30; i++) { if(finish - start > tle) return; s = i; if(N > 5000 and i == 20) break; sort(A + 1, A + N + 1, cmpmink); WORK(); REVWORK(); } if(N <= 5000) { for(int i = 1; i <= 100000; i++) { if(finish - start > tle) return; shuffle(A + 1, A + N + 1, rng); KVADRAT(); } } for(int i = 1; i <= 100000; i++) { if(finish - start > tle) return; shuffle(A + 1, A + N + 1, rng); WORK(); REVWORK(); } } void IN() { freopen("mars.in", "r", stdin); scanf("%d %lld", &N, &R); R *= R * 4; for(int i = 1; i <= N; i++) { scanf("%lld %lld", &A[i].x, &A[i].y); A[i].order = i; X[i] = A[i].x; Y[i] = A[i].y; } } void OUT() { freopen("mars.out", "w", stdout); printf("%d\n", FK); for(int i = 1; i <= FK; i++) printf("%d ", FS[i]); printf("\n"); } int main() { rng.seed(time(NULL)); IN(); SOLVE(); OUT(); return 0; }