Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool chk(int dist, int x, vector<vector<int>> &dp1, vector<vector<int>> &dp2, int A, int B){
- unordered_set<int> st;
- queue<int> q;
- q.push(x);
- while(!q.empty()){
- auto z = q.front();
- q.pop();
- st.insert(z);
- for(int i=0;i<B;i++)
- if(dp1[i][x]<=dist && st.find(i)==st.end())
- q.push(i);
- }
- for(int i=0;i<A;i++){
- int mn=INT_MAX;
- for(auto it=st.begin();it!=st.end();it++)
- mn=min(mn, dp2[(*it)][i]);
- if(mn>dist)
- return 0;
- }
- return 1;
- }
- int Solution::solve(int A, int B, vector<vector<int> > &C, vector<vector<int> > &D) {
- vector<vector<int>> dp1(B, vector<int>(B));
- for(int i=0;i<B;i++){
- for(int j=0;j<B;j++){
- dp1[i][j] = (D[i][0]-D[j][0])^2+(D[i][1]-D[j][1])^2;
- }
- }
- vector<vector<int>> dp2(B, vector<int>(A));
- for(int i=0;i<B;i++)
- for(int j=0;j<A;j++)
- dp2[i][j] = (D[i][0]-C[j][0])^2+(D[i][1]-C[j][1])^2;
- int ans = INT_MAX;
- for(int i=0;i<B;i++){
- int mx=INT_MIN;
- for(int j=0;j<A;j++)
- mx = max(mx, dp2[i][j]);
- int low=1, high = mx;
- mx = INT_MAX;
- while(low<=high){
- int mid = (low+high)/2;
- if(chk(mid, i, dp1, dp2, A, B)){
- mx=min(mx, mid);
- // cout<<"x";
- high=mid-1;
- }
- else
- low = mid+1;
- }
- ans=min(ans, mx);
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement