1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| void solve(){ int n, d; std::cin >> n >> d; std::vector<std::pair<int, int>> cur(n + 1); std::map<std::pair<int, int>, int> ind; for(int i = 1; i <= n; i++){ std::cin >> cur[i].ff >> cur[i].ss; ind[{cur[i].ff, cur[i].ss}] = i; }
std::map<int, std::set<std::pair<int, int>>> shangx_d; std::map<int, std::set<std::pair<int, int>>> xiax_d; std::map<int, std::set<std::pair<int, int>>> shangaddd; std::map<int, std::set<std::pair<int, int>>> xiaaddd; std::map<int, std::set<std::pair<int, int>>> shangx_dp; std::map<int, std::set<std::pair<int, int>>> xiax_dp; std::map<int, std::set<std::pair<int, int>>> shangadddp; std::map<int, std::set<std::pair<int, int>>> xiaadddp;
std::sort(cur.begin() + 1, cur.end()); int left = 1; int right = 1; for(int i = 1; i <= n; i++){ int x = cur[i].ff; int y = cur[i].ss;
while(right <= n && cur[right].ff <= x + d){ int xn = cur[right].ff; int yn = cur[right].ss; shangadddp[xn - yn].insert({xn, yn}); xiaadddp[xn + yn].insert({xn, yn}); if(shangadddp[xn - yn].count({xn - d / 2, yn - d / 2})){ int minn = std::min(ind[{xn, yn}], ind[{xn - d / 2, yn - d / 2}]); int maxn = std::max(ind[{xn, yn}], ind[{xn - d / 2, yn - d / 2}]); shangaddd[xn - yn].insert({minn, maxn}); } if(xiaadddp[xn + yn].count({xn - d / 2, yn + d / 2})){ int minn = std::min(ind[{xn, yn}], ind[{xn - d / 2, yn + d / 2}]); int maxn = std::max(ind[{xn, yn}], ind[{xn - d / 2, yn + d / 2}]); xiaaddd[xn + yn].insert({minn, maxn}); } right += 1; }
while(left <= i && cur[left].ff < x - d){ int xn = cur[left].ff; int yn = cur[left].ss; shangx_dp[xn - yn].erase({xn, yn}); xiax_dp[xn + yn].erase({xn, yn});
if(shangx_dp[xn - yn].count({xn + d / 2, yn + d / 2})){ int minn = std::min(ind[{xn, yn}], ind[{xn + d / 2, yn + d / 2}]); int maxn = std::max(ind[{xn, yn}], ind[{xn + d / 2, yn + d / 2}]); shangx_d[xn - yn].erase({minn, maxn}); }
if(xiax_dp[xn + yn].count({xn + d / 2, yn - d / 2})){ int minn = std::min(ind[{xn, yn}], ind[{xn + d / 2, yn - d / 2}]); int maxn = std::max(ind[{xn, yn}], ind[{xn + d / 2, yn - d / 2}]); xiax_d[xn + yn].erase({minn, maxn}); } left += 1; } shangx_dp[x - y].insert({x, y}); xiax_dp[x + y].insert({x, y}); if(shangx_dp[x - y].count({x - d / 2, y - d / 2})){ int minn = std::min(ind[{x, y}], ind[{x - d / 2, y - d / 2}]); int maxn = std::max(ind[{x, y}], ind[{x - d / 2, y - d / 2}]); shangx_d[x - y].insert({minn, maxn}); } if(xiax_dp[x + y].count({x - d / 2, y + d / 2})){ int minn = std::min(ind[{x, y}], ind[{x - d / 2, y + d / 2}]); int maxn = std::max(ind[{x, y}], ind[{x - d / 2, y + d / 2}]); xiax_d[x + y].insert({minn, maxn}); }
int needx = x + d; int needy = y; if(!shangaddd[needx - needy].empty()){ auto p = *shangaddd[needx - needy].begin(); std::cout << ind[{x, y}] << space << p.ff << space << p.ss << endl; return; } if(!xiaaddd[needx + needy].empty()){ auto p = *xiaaddd[needx + needy].begin(); std::cout << ind[{x, y}] << space << p.ff << space << p.ss << endl; return; } needx = x - d; needy = y; if(!shangx_d[needx - needy].empty()){ auto p = *shangx_d[needx - needy].begin(); std::cout << ind[{x, y}] << space << p.ff << space << p.ss << endl; return; } if(!xiax_d[needx + needy].empty()){ auto p = *xiax_d[needx + needy].begin(); std::cout << ind[{x, y}] << space << p.ff << space << p.ss << endl; return; }
shangadddp[x - y].erase({x, y}); xiaadddp[x + y].erase({x, y}); if(shangadddp[x - y].count({x + d / 2, y + d / 2})){ int minn = std::min(ind[{x, y}], ind[{x + d / 2, y + d / 2}]); int maxn = std::max(ind[{x, y}], ind[{x + d / 2, y + d / 2}]); shangaddd[x - y].erase({minn, maxn}); } if(xiaadddp[x + y].count({x + d / 2, y - d / 2})){ int minn = std::min(ind[{x, y}], ind[{x + d / 2, y - d / 2}]); int maxn = std::max(ind[{x, y}], ind[{x + d / 2, y - d / 2}]); xiaaddd[x + y].erase({minn, maxn}); } } std::cout << 0 << space << 0 << space << 0 << endl; }
|