标签:
#pragma warning(disable:4996) #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #include <queue> #include <cstdlib> using namespace std; #define maxn 51000 #define dim 5 namespace KDTree { int K; struct Point { int x[dim]; void input(){ for (int i = 0; i < K; ++i){ scanf("%d", x + i); } } void output(){ for (int i = 0; i < K; ++i){ if (i) printf(" "); printf("%d", x[i]); } puts(""); } double dist(const Point &b){ double sum = 0; for (int i = 0; i < K; ++i) sum += (x[i] - b.x[i])*(x[i] - b.x[i]); return sqrt(sum); } }; struct qnode{ Point p; double dis; qnode(){}; qnode(Point _p, double _dis) :p(_p), dis(_dis){} bool operator < (const qnode &b) const{ return dis < b.dis; } }; priority_queue<qnode> que; struct cmpx { int div; cmpx(int _div) :div(_div){} bool operator()(const Point &a, const Point &b){ for (int i = 0; i < K; ++i){ if (a.x[(div + i) % K] != b.x[(div + i) % K]) return a.x[(div + i) % K] < b.x[(div + i) % K]; } return true; } }; bool cmp(const Point &a, const Point &b, int div){ cmpx cp = cmpx(div); return cp(a, b); } struct Node { Point e; Node *lc, *rc; int div; }pool[maxn], *tail, *root; void init(){ tail = pool; } Node *build(Point *a, int l, int r, int div) { if (l >= r) return NULL; Node *p = tail++; p->div = div; int mid = (l + r) >> 1; nth_element(a + l, a + mid, a + r, cmpx(div)); p->e = a[mid]; p->lc = build(a, l, mid, (div + 1) % K); p->rc = build(a, mid + 1, r, (div + 1) % K); return p; } void search(Point p, Node *x, int div, int m) { if (!x) return; if (cmp(p, x->e, div)){ search(p, x->lc, (div + 1) % K, m); if (que.size() < m){ que.push(qnode(x->e, p.dist(x->e))); search(p, x->rc, (div + 1) % K, m); } else{ if (p.dist(x->e) < que.top().dis){ que.pop(); que.push(qnode(x->e, p.dist(x->e))); } if (fabs(x->e.x[div] - p.x[div] + .0) < que.top().dis){ search(p, x->rc, (div + 1) % K, m); } } } else{ search(p, x->rc, (div + 1) % K, m); if (que.size() < m){ que.push(qnode(x->e, p.dist(x->e))); search(p, x->lc, (div + 1) % K, m); } else{ if (p.dist(x->e) < que.top().dis){ que.pop(); que.push(qnode(x->e, p.dist(x->e))); } if (fabs(x->e.x[div] - p.x[div] + .0) < que.top().dis){ search(p, x->lc, (div + 1) % K, m); } } } } void search(Point p, int m) { while (!que.empty()) que.pop(); search(p, root, 0, m); } }; KDTree::Point p[maxn]; int main() { int n, k; while (cin >> n >> k) { KDTree::K = k; for (int i = 0; i < n; ++i) p[i].input(); KDTree::init(); KDTree::root = build(p, 0, n, 0); int Q; cin >> Q; while (Q--) { KDTree::Point qpoint; qpoint.input(); int m; scanf("%d", &m); KDTree::search(qpoint, m); printf("the closest %d points are:\n", m); int cnt = 0; while (!KDTree::que.empty()){ p[cnt++] = KDTree::que.top().p; KDTree::que.pop(); } for (int i = m - 1; i >= 0; --i){ p[i].output(); } } } return 0; }
#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <cmath> #include <ctime> using namespace std; #define ll long long #define mod 1000000007 ll mod_pow(ll a, ll n, ll mo) { ll ret = 1; while (n){ if (n & 1) ret = ret*a%mo; a = a*a%mo; n >>= 1; } return ret; } ll inv2 = mod_pow(2, mod - 2, mod); void fwt_xor(ll a[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; fwt_xor(a, l, mid); fwt_xor(a, mid + 1, r); int len = mid - l + 1; for (int i = l; i <= mid; ++i){ ll x1 = a[i]; ll x2 = a[i + len]; a[i] = (x1 + x2) % mod; a[i + len] = (x1 - x2 + mod) % mod; } } void ifwt_xor(ll a[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; int len = mid - l + 1; for (int i = l; i <= mid; ++i){ // y1=x1+x2 // y2=x1-x2 ll y1 = a[i]; ll y2 = a[i + len]; a[i] = (y1 + y2)*inv2 % mod; a[i + len] = ((y1 - y2 + mod) % mod*inv2) % mod; } ifwt_xor(a, l, mid); ifwt_xor(a, mid + 1, r); } void fwt_and(ll a[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; fwt_and(a, l, mid); fwt_and(a, mid + 1, r); int len = mid - l + 1; for (int i = l; i <= mid; ++i){ ll x1 = a[i]; ll x2 = a[i + len]; a[i] = (x1 + x2) % mod; a[i + len] = x2 % mod; } } void ifwt_and(ll a[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; int len = mid - l + 1; for (int i = l; i <= mid; ++i){ // y1=x1+x2 // y2=x2 ll y1 = a[i]; ll y2 = a[i + len]; a[i] = (y1 - y2 + mod ) % mod; a[i + len] = y2 % mod; } ifwt_and(a, l, mid); ifwt_and(a, mid + 1, r); } void fwt_or(ll a[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; fwt_or(a, l, mid); fwt_or(a, mid + 1, r); int len = mid - l + 1; for (int i = l; i <= mid; ++i){ ll x1 = a[i]; ll x2 = a[i + len]; a[i] = x1 % mod; a[i + len] = (x2+x1) % mod; } } void ifwt_or(ll a[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; int len = mid - l + 1; for (int i = l; i <= mid; ++i){ // y1=x1 // y2=x2+x1 ll y1 = a[i]; ll y2 = a[i + len]; a[i] = y1 % mod; a[i + len] = (y2 - y1 + mod) % mod; } ifwt_or(a, l, mid); ifwt_or(a, mid + 1, r); } const int maxn = 1024; bool test_xor() { ll a1[maxn], a2[maxn]; ll b1[maxn], b2[maxn]; for (int i = 0; i < maxn; ++i){ a1[i] = a2[i] = rand(); b1[i] = b2[i] = rand(); } ll c1[maxn]; ll c2[maxn]; memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); for (int i = 0; i < maxn; ++i){ for (int j = 0; j < maxn; ++j){ c1[i^j] += (a1[i] * b1[j]) % mod; c1[i^j] %= mod; } } fwt_xor(a2, 0, maxn - 1); fwt_xor(b2, 0, maxn - 1); for (int i = 0; i < maxn; ++i){ c2[i] = a2[i] * b2[i] % mod; } ifwt_xor(c2, 0, maxn - 1); for (int i = 0; i < maxn; ++i){ if (c1[i] != c2[i]){ return false; } } return true; } bool test_and() { ll a1[maxn], a2[maxn]; ll b1[maxn], b2[maxn]; for (int i = 0; i < maxn; ++i){ a1[i] = a2[i] = rand(); b1[i] = b2[i] = rand(); } ll c1[maxn]; ll c2[maxn]; memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); for (int i = 0; i < maxn; ++i){ for (int j = 0; j < maxn; ++j){ c1[i&j] += (a1[i] * b1[j]) % mod; c1[i&j] %= mod; } } fwt_and(a2, 0, maxn - 1); fwt_and(b2, 0, maxn - 1); for (int i = 0; i < maxn; ++i){ c2[i] = a2[i] * b2[i] % mod; } ifwt_and(c2, 0, maxn - 1); for (int i = 0; i < maxn; ++i){ if (c1[i] != c2[i]){ return false; } } return true; } bool test_or() { ll a1[maxn], a2[maxn]; ll b1[maxn], b2[maxn]; for (int i = 0; i < maxn; ++i){ a1[i] = a2[i] = rand(); b1[i] = b2[i] = rand(); } ll c1[maxn]; ll c2[maxn]; memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); for (int i = 0; i < maxn; ++i){ for (int j = 0; j < maxn; ++j){ c1[i|j] += (a1[i] * b1[j]) % mod; c1[i|j] %= mod; } } fwt_or(a2, 0, maxn - 1); fwt_or(b2, 0, maxn - 1); for (int i = 0; i < maxn; ++i){ c2[i] = a2[i] * b2[i] % mod; } ifwt_or(c2, 0, maxn - 1); for (int i = 0; i < maxn; ++i){ if (c1[i] != c2[i]){ return false; } } return true; } int main() { srand(time(0)); if (test_xor()){ puts("test_xor succ."); } else{ puts("test_xor fail"); } if (test_and()){ puts("test_and succ."); } else{ puts("test_and fail"); } if (test_or()){ puts("test_or succ."); } else{ puts("test_or fail"); } system("pause"); }
标签:
原文地址:http://www.cnblogs.com/chanme/p/4877334.html