ধরুন আমাদের কাছে স্থানাঙ্কের একটি তালিকা রয়েছে যেখানে প্রতিটি উপাদান ইউক্লিডীয় স্থানাঙ্কের প্রতিনিধিত্ব করে [x, y] ফর্মের। আমাদের সবচেয়ে ছোট বর্গ দূরত্ব (x1) বের করতে হবে - x2 ) 2 + (y1 - y2 ) 2 যে কোনো দুটি প্রদত্ত স্থানাঙ্কের মধ্যে।
সুতরাং, ইনপুট যদি স্থানাঙ্কের মত হয় ={{1, 2},{1, 4},{3, 5}}, তাহলে আউটপুট হবে 4।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি মানচিত্র ytorightmostx
সংজ্ঞায়িত করুন -
অ্যারে স্থানাঙ্কগুলি সাজান
-
ret :=অসীম
-
স্থানাঙ্কের প্রতিটি p-এর জন্য −
-
it =মানটি ফেরত দিন যেখানে (p[1] - sqrt(ret)) ytorightmostx-এ আছে বা ytorightmostx থেকে এটির থেকে সবচেয়ে ছোট মান
-
যদিও এটি ytorightmostx এর শেষ উপাদানের সমান নয়, −
করুন-
yd :=প্রথম - p[1] এর
-
যদি yd> 0 এবং yd * yd>=ret হয়, তাহলে −
-
লুপ থেকে বেরিয়ে আসুন
-
-
nxt =এটা
-
nxt 1 দ্বারা বৃদ্ধি করুন
-
ret :=সর্বনিম্ন (ret, dist(p[0], p[1], এর প্রথম মান, এর দ্বিতীয় মান)
-
xd :=এর দ্বিতীয় মান - p[0>
-
যদি xd * xd>=ret হয়, তাহলে −
-
ytorightmostx
থেকে এটি মুছুন
-
-
এটা :=nxt
-
-
ytorightmostx[p[1]] :=p[0]
-
-
রিটার্ন রিটার্ন
-
একটি ফাংশন dist(), এটি xl, yl, xr, yr লাগবে।
-
xd :=xl - xr
-
yd :=yl - yr
-
xd * xd + yd * yd
ফেরত দিন
-
উদাহরণ
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h>
using namespace std;
long long dist(long long xl, long long yl, long long xr, long long yr) {
long long xd = xl - xr;
long long yd = yl - yr;
return xd * xd + yd * yd;
}
int solve(vector<vector<int>>& coordinates) {
map<long long, long long> ytorightmostx;
sort(coordinates.begin(), coordinates.end());
long long ret = 1e18;
for (auto& p : coordinates) {
auto it = ytorightmostx.lower_bound(p[1] - sqrt(ret));
while (it != ytorightmostx.end()) {
long long yd = it->first - p[1];
if (yd > 0 && yd * yd >= ret) {
break;
}
auto nxt = it;
nxt++;
ret = min(ret, dist(p[0], p[1], it->second, it->first));
long long xd = (it->second - p[0]);
if (xd * xd >= ret) {
ytorightmostx.erase(it);
}
it = nxt;
}
ytorightmostx[p[1]] = p[0];
}
return ret;
}
int main(){
vector<vector<int>> coord = {{1, 2},{1, 4},{3, 5}};
cout << solve(coord) << endl;
return 0;
} ইনপুট
{{1, 2},{1, 4},{3, 5}} আউটপুট
4