{"id":13,"date":"2012-02-28T16:03:15","date_gmt":"2012-02-28T08:03:15","guid":{"rendered":"http:\/\/www.shuizilong.com\/house\/?p=13"},"modified":"2012-03-03T01:17:50","modified_gmt":"2012-03-02T17:17:50","slug":"ural-1369-cockroach-race","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/house\/archives\/ural-1369-cockroach-race\/","title":{"rendered":"URAL 1369. Cockroach Race"},"content":{"rendered":"<h3>Brief description: <\/h3>\n<p>\u7ed9\u5b9a\u5e73\u9762\u4e0a\u7684\u4e00\u7ec4\u70b9\u96c6 \uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u8be2\u95ee\uff0c\u8f93\u51fa\u4e00\u4e2a\u65b0\u7684\u70b9\uff0c\u67e5\u8be2\u6240\u6709\u8ddd\u79bb\u5979\u6700\u8fd1\u7684\u70b9\u7684\u7f16\u53f7\u3002<br \/>\n\uff08\u70b9\u96c6\u89c4\u6a21 N <= 100000, \u8be2\u95ee\u6b21\u6570 M <= 10000)\n\n<!--more--><\/p>\n<h3>Analysis: <\/h3>\n<p>.. .<\/p>\n<h4>Naive: <\/h4>\n<pre class=\"brush: cpp; light: false; title: ; toolbar: true; notranslate\" title=\"\">\r\nconst int N = 100009;\r\n\r\nPo P&#x5B;N], cur;\r\nint n, m;\r\n\r\nint main() {\r\n\r\n    \/\/freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\r\n\r\n    REP_C(i, _RD(n)){\r\n        scanf(&quot;%lf %lf&quot;, &amp;P&#x5B;i].x, &amp;P&#x5B;i].y);\r\n    }\r\n\r\n    DO_C(RD()){\r\n        scanf(&quot;%lf %lf&quot;, &amp;cur.x, &amp;cur.y);\r\n        DB d = INF; REP(i, n) checkMin(d, dist_sqr(cur, P&#x5B;i]));\r\n        REP(i, n) if (d == dist_sqr(cur, P&#x5B;i]))\r\n            printf(&quot;%d &quot;, i + 1);\r\n        puts(&quot;&quot;);\r\n    }\r\n}\r\n<\/pre>\n<p>&#8230;.<\/p>\n<pre class=\"brush: cpp; light: false; title: ; toolbar: true; notranslate\" title=\"\">\r\n\r\n<\/pre>\n<h4>Hash: <\/h4>\n<h4>Data Structure:<\/h4>\n<p><a href=\"https:\/\/www.shuizilong.com\/house\/archives\/ural-1369-cockroach-race\/attachment\/1\/\" rel=\"attachment wp-att-15\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"15\" data-permalink=\"https:\/\/www.shuizilong.com\/house\/archives\/ural-1369-cockroach-race\/attachment\/1\/\" data-orig-file=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1.jpg\" data-orig-size=\"491,401\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1-300x245.jpg\" data-large-file=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1.jpg\" src=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1.jpg\" alt=\"\" title=\"1\" width=\"491\" height=\"401\" class=\"aligncenter size-full wp-image-15\" srcset=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1.jpg 491w, https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1-300x245.jpg 300w, https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/1-367x300.jpg 367w\" sizes=\"auto, (max-width: 491px) 100vw, 491px\" \/><\/a><\/p>\n<pre class=\"brush: cpp; light: false; title: Point QuadTree.cpp; toolbar: true; notranslate\" title=\"Point QuadTree.cpp\">\r\n...\r\nint random(int l, int r){\r\n    return rand() % (r - l + 1) + l;\r\n}\r\n\r\nstruct Rec: Po{\r\n    int id;\r\n};\r\n\r\nconst int N = 100009;\r\nconst int NN = N;\r\n\r\n\/*\r\n  |\r\n 1|0\r\n-----\r\n 3|2\r\n  |\r\n*\/\r\n\r\nRec node&#x5B;NN]; DB xl&#x5B;NN], xr&#x5B;NN], yl&#x5B;NN], yr&#x5B;NN]; int c&#x5B;NN]&#x5B;4], root, total;\r\n\/\/ Point Quadtree .. .\r\n\r\nRec P&#x5B;N], temp; Po cur; DB d; VI L;\r\nint n, m;\r\n\r\ninline int Dir(Po a, Po b){\r\n    return a.x &lt; b.x ? (a.y &lt; b.y ? 3 : 1) : (a.y &lt; b.y ? 2 : 0);\r\n}\r\n\r\ninline int Rev(int dir){\r\n    return dir ^ 3;\r\n}\r\n\r\nvoid Insert(int &amp;now = root){\r\n    if (!now) now = ++total, node&#x5B;now] = temp;\r\n    else Insert(c&#x5B;now]&#x5B;Dir(temp, node&#x5B;now])]);\r\n}\r\n\r\nvoid Cut(int now, int parent){\r\n    if (!now) return;\r\n\r\n    if (node&#x5B;now].x &lt; node&#x5B;parent].x) xl&#x5B;now] = xl&#x5B;parent], xr&#x5B;now] = node&#x5B;parent].x; else xl&#x5B;now] = node&#x5B;parent].x, xr&#x5B;now] = xr&#x5B;parent];\r\n    if (node&#x5B;now].y &lt; node&#x5B;parent].y) yl&#x5B;now] = yl&#x5B;parent], yr&#x5B;now] = node&#x5B;parent].y; else yl&#x5B;now] = node&#x5B;parent].y, yr&#x5B;now] = yr&#x5B;parent];\r\n    REP(i, 4) Cut(c&#x5B;now]&#x5B;i], now);\r\n}\r\n\r\nvoid Update(Rec item){\r\n\r\n    DB dd = dist_sqr(cur, item);\r\n\r\n    if (sgn(dd, d) &lt;= 0){\r\n        if (sgn(dd, d) == -1) d = dd, CLR(L);\r\n        L.PB(item.id);\r\n    }\r\n}\r\n\r\nvoid Find(int now = root){\r\n\r\n    if (!now) return;\r\n\r\n    if (xl&#x5B;now] &lt;= cur.x &amp;&amp; cur.x &lt;= xr&#x5B;now]){\r\n        if (cur.y &lt;= yl&#x5B;now]) if (sgn(d, sqr(yl&#x5B;now] - cur.y)) &lt; 0) return;\r\n        if (yr&#x5B;now] &lt;= cur.y) if (sgn(d, sqr(cur.y - yr&#x5B;now])) &lt; 0) return;\r\n    }\r\n    else if (yl&#x5B;now] &lt;= cur.y &amp;&amp; cur.y &lt;= yr&#x5B;now]){\r\n        if (cur.x &lt;= xl&#x5B;now]) if (sgn(d, sqr(xl&#x5B;now] - cur.x)) &lt; 0) return;\r\n        if (xr&#x5B;now] &lt;= cur.x) if (sgn(d, sqr(cur.x - xr&#x5B;now])) &lt; 0) return;\r\n    }\r\n    else if (sgn(d, min(sqr(xl&#x5B;now] - cur.x), sqr(xr&#x5B;now] - cur.x)) + min(sqr(yl&#x5B;now] - cur.y), sqr(yr&#x5B;now] - cur.y))) &lt; 0) return;\r\n\r\n    int dir = Dir(cur, node&#x5B;now]);\r\n    Find(c&#x5B;now]&#x5B;dir]), Update(node&#x5B;now]);\r\n    if (dir == 0 || dir == 3) Find(c&#x5B;now]&#x5B;1]), Find(c&#x5B;now]&#x5B;2]);\r\n    else if (dir == 1 || dir == 2) Find(c&#x5B;now]&#x5B;0]), Find(c&#x5B;now]&#x5B;3]);\r\n}\r\n\r\nint main() {\r\n\r\n    \/\/freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\r\n\r\n    REP_C(i, _RD(n)){\r\n        scanf(&quot;%lf %lf&quot;, &amp;P&#x5B;i].x, &amp;P&#x5B;i].y);\r\n        P&#x5B;i].id = i + 1;\r\n    }\r\n\r\n    srand((unsigned)time(NULL)); REP(i, n) swap(P&#x5B;i], P&#x5B;random(i, n - 1)]);\r\n    REP(i, n) temp = P&#x5B;i], Insert();\r\n\r\n\r\n    xl&#x5B;root] = yl&#x5B;root] = -10000, xr&#x5B;root] = yr&#x5B;root] = 10000;\r\n    REP(i, 4) Cut(c&#x5B;root]&#x5B;i], root);\r\n\r\n    DO_C(RD()){\r\n        scanf(&quot;%lf %lf&quot;, &amp;cur.x, &amp;cur.y), CLR(L), d = INF; Find();\r\n        SRT(L); REP(i, SZ(L) - 1) printf(&quot;%d &quot;, L&#x5B;i]);\r\n        printf(&quot;%d\\n&quot;, L&#x5B;SZ(L)-1]);\r\n    }\r\n}\r\n<\/pre>\n<p><a href=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"16\" data-permalink=\"https:\/\/www.shuizilong.com\/house\/archives\/ural-1369-cockroach-race\/attachment\/2\/\" data-orig-file=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2.jpg\" data-orig-size=\"475,603\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2-236x300.jpg\" data-large-file=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2.jpg\" src=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2.jpg\" alt=\"\" title=\"2\" width=\"475\" height=\"603\" class=\"aligncenter size-full wp-image-16\" srcset=\"https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2.jpg 475w, https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/02\/2-236x300.jpg 236w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/a><\/p>\n<pre class=\"brush: cpp; light: false; title: 2-d Tree.cpp; toolbar: true; notranslate\" title=\"2-d Tree.cpp\">\r\n...\r\nint random(int l, int r){\r\n    return rand() % (r - l + 1) + l;\r\n}\r\n\r\nstruct Rec: Po{\r\n    int id;\r\n};\r\n\r\nconst int N = 100009;\r\nconst int NN = N;\r\n\r\nRec node&#x5B;NN]; DB xl&#x5B;NN], xr&#x5B;NN], yl&#x5B;NN], yr&#x5B;NN];\r\nint c&#x5B;NN]&#x5B;2], root, total;\r\n\/\/ 2-d tree .. .\r\n\r\nRec P&#x5B;N], temp; Po cur; DB d; VI L;\r\nint n, m;\r\n\r\ninline int Dir(int level, Po a, Po b){\r\n    if (level&amp;1) return a.x &lt; b.x ? 0 : 1;\r\n    else return a.y &lt; b.y ? 0 : 1;\r\n}\r\n\r\ninline int Rev(int dir){\r\n    return dir ^ 1;\r\n}\r\n\r\nvoid Insert(int &amp;now = root, int level = 0){\r\n    if (!now) now = ++total, node&#x5B;now] = temp;\r\n    else Insert(c&#x5B;now]&#x5B;Dir(level, temp, node&#x5B;now])], level + 1);\r\n}\r\n\r\nvoid Cut(int now, int parent, int level){\r\n    if (!now) return;\r\n\r\n    if (level&amp;1){\r\n        if (node&#x5B;now].x &lt; node&#x5B;parent].x) xl&#x5B;now] = xl&#x5B;parent], xr&#x5B;now] = node&#x5B;parent].x; else xl&#x5B;now] = node&#x5B;parent].x, xr&#x5B;now] = xr&#x5B;parent];\r\n        yl&#x5B;now] = yl&#x5B;parent], yr&#x5B;now] = yr&#x5B;parent];\r\n    }\r\n    else {\r\n        if (node&#x5B;now].y &lt; node&#x5B;parent].y) yl&#x5B;now] = yl&#x5B;parent], yr&#x5B;now] = node&#x5B;parent].y; else yl&#x5B;now] = node&#x5B;parent].y, yr&#x5B;now] = yr&#x5B;parent];\r\n        xl&#x5B;now] = xl&#x5B;parent], xr&#x5B;now] = xr&#x5B;parent];\r\n    }\r\n\r\n\r\n    REP(i, 2) Cut(c&#x5B;now]&#x5B;i], now, level + 1);\r\n}\r\n\r\nvoid Update(Rec item){\r\n\r\n    DB dd = dist_sqr(cur, item);\r\n\r\n    if (sgn(dd, d) &lt;= 0){\r\n        if (sgn(dd, d) == -1) d = dd, CLR(L);\r\n        L.PB(item.id);\r\n    }\r\n}\r\n\r\nvoid Find(int now = root, int level = 0){\r\n\r\n    if (!now || sgn(d, ((xl&#x5B;now] &lt;= cur.x &amp;&amp; cur.x &lt;= xr&#x5B;now]) ? 0. : min(sqr(cur.x - xl&#x5B;now]), sqr(cur.x - xr&#x5B;now]))) + ((yl&#x5B;now] &lt;= cur.y &amp;&amp; cur.y &lt;= yr&#x5B;now]) ? 0. : min(sqr(cur.y - yl&#x5B;now]), sqr(cur.y - yr&#x5B;now])))) &lt; 0) return;\r\n\r\n    int dir = Dir(level, cur, node&#x5B;now]); Find(c&#x5B;now]&#x5B;dir], level + 1), Update(node&#x5B;now]); Find(c&#x5B;now]&#x5B;Rev(dir)], level + 1);\r\n}\r\n\r\nint main() {\r\n\r\n    \/\/freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\r\n\r\n    REP_C(i, _RD(n)){\r\n        scanf(&quot;%lf %lf&quot;, &amp;P&#x5B;i].x, &amp;P&#x5B;i].y);\r\n        P&#x5B;i].id = i + 1;\r\n    }\r\n\r\n    \/\/srand((unsigned)time(NULL)); REP(i, n) swap(P&#x5B;i], P&#x5B;random(i, n - 1)]);\r\n    REP(i, n) temp = P&#x5B;i], Insert();\r\n\r\n    xl&#x5B;root] = yl&#x5B;root] = -10000, xr&#x5B;root] = yr&#x5B;root] = 10000;\r\n    REP(i, 2) Cut(c&#x5B;root]&#x5B;i], root, 0);\r\n\r\n    DO_C(RD()){\r\n        scanf(&quot;%lf %lf&quot;, &amp;cur.x, &amp;cur.y), CLR(L), d = INF; Find();\r\n        SRT(L); REP(i, SZ(L) - 1) printf(&quot;%d &quot;, L&#x5B;i]);\r\n        printf(&quot;%d\\n&quot;, L&#x5B;SZ(L)-1]);\r\n    }\r\n}\r\n<\/pre>\n<p><a href='https:\/\/www.shuizilong.com\/house\/archives\/ural-1369-cockroach-race\/try\/' rel='attachment wp-att-20'>try\u795e\u7684\u4ee3\u7801<\/a><\/p>\n<h4>Vonoir Graph: <\/h4>\n<h3>Reference: <\/h3>\n<p><a href='https:\/\/www.shuizilong.com\/house\/archives\/ural-1369-cockroach-race\/the-design-and-analysis-of-spatial-data-structureshanansamet\/' rel='attachment wp-att-21'>The Design and Analysis of Spatial Data Structures[Hanan][Samet]<\/a><\/p>\n<h3>External links: <\/h3>\n<p><a href=\"http:\/\/acm.timus.ru\/problem.aspx?space=1&#038;num=1369\">http:\/\/acm.timus.ru\/problem.aspx?space=1&#038;num=1369<\/a><br \/>\n<a href=\"http:\/\/en.wikipedia.org\/wiki\/Nearest_neighbor_search\">http:\/\/en.wikipedia.org\/wiki\/Nearest_neighbor_search<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Brief description: \u7ed9\u5b9a\u5e73\u9762\u4e0a\u7684\u4e00\u7ec4\u70b9\u96c6 \uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u8be2\u95ee\uff0c\u8f93\u51fa\u4e00\u4e2a\u65b0\u7684\u70b9\uff0c\u67e5\u8be2\u6240\u6709\u8ddd\u79bb\u5979\u6700\u8fd1\u7684\u70b9\u7684\u7f16\u53f7\u3002 \uff08\u70b9\u96c6\u89c4\u6a21 N<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[1],"tags":[24],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-24"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2tdP7-d","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":1,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":14,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/13\/revisions\/14"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}