@sksama
Hello friends, what is wrong with this solution for AGGRCOW. I am using a combination of binary search and priority queue. I tested the testcases but I am getting WA. Please help!!
#include <bits/stdc++.h>
using namespace std;
pair<long long, long long> bsearch(vector<long long>& v, long long l, long long r, long long midval) {
long long l1 = l, r1 = r;
long long pleft = -1, prite = -1;
while((l <= r)) {
auto mid = l + (r - l)/2;
if (v[mid] == midval) {
return make_pair(min(abs(v[mid] - v[l1]), abs(v[mid] - v[r1])), mid);
} else {
if (v[mid] < midval) {
l = mid + 1;
if ((mid+1) >= r1) {
return make_pair(min(abs(v[mid] - v[l1]), abs(v[mid] - v[r1])), mid);
}
// return
if (v[mid + 1] == midval) {
return make_pair(min(abs(v[mid+1] - v[l1]), abs(v[mid+1] - v[r1])), mid+1);
}
//normal case
if (v[mid + 1] > midval) {
r = mid + 1;
l = mid;
break;
}
} else {
r = mid - 1;
if ((mid - 1) <= l1) {
return make_pair(min(abs(v[mid] - v[l1]), abs(v[mid] - v[r1])), mid);
}
if (v[mid - 1] == midval) {
return make_pair(min(abs(v[mid-1] - v[l1]), abs(v[mid-1] - v[r1])), mid-1);
}
// normal case
if (v[mid - 1] < midval) {
r = mid;
l = mid - 1;
break;
}
}
}
}
// cout << midval<< l << r <<endl;
//auto ll = 0;
// if (l == r) {
// r = l + 1;
// ll = l - 1;
// }
pleft = min(abs(v[l] - v[l1]), abs(v[r1] - v[l]));
prite = min(abs(v[r] - v[l1]), abs(v[r] - v[r1]));
// auto pleftl = min(abs(v[ll] - v[l1]), abs(v[r1] - v[ll]));
if (l <= l1) {
pleft = -1;
}
if (r >= r1) {
prite = -1;
}
// if (ll <= l1) {
// pleftl = -1;
// }
if (pleft > prite) {
// if (pleftl > pleft) {
// return make_pair(pleftl, l);
// }
return make_pair(min(abs(v[l] - v[l1]), abs(v[r1] - v[l])), l);
} else {
// if (pleftl > prite) {
// return make_pair(pleftl, l);
// }
return make_pair(min(abs(v[r] - v[l1]), abs(v[r] - v[r1])), r);
}
}
long long midfun(long long l, long long r) {
return (l + (r - l)/2);
}
int main() {
long long t;
cin >> t;
while(t--) {
long long n, c;
cin >> n >> c;
vector<long long> v;
for (long long i = 0; i < n; ++i) {
long long val;
cin >> val;
v.push_back(val);
}
sort(v.begin(), v.end());
long long l = 0;
long long r = n-1;
c -= 2;
// pmin, pidx, l, r
auto cmp = [&](pair<pair<long long, long long>, pair<long long, long long>>& lft, pair<pair<long long, long long>, pair<long long, long long>>& rt) {
return lft.first.first < rt.first.first;
};
priority_queue<pair<pair<long long, long long>, pair<long long, long long>>, vector<pair<pair<long long, long long>, pair<long long, long long>>>, decltype(cmp)> pq(cmp);
long long pmin;
long long midval = midfun(v[0], v[n-1]);
auto res = bsearch(v, 0, n-1, midval);
pmin = v[n-1] - v[0];
if (c == 0) {
cout << pmin << endl;
continue;
}
pq.push(make_pair(res, make_pair(0, n-1)));
while(c--) {
auto cur = pq.top();
pq.pop();
if (c == 0) {
pmin = cur.first.first;
}
long long midval1 = midfun(v[cur.second.first], v[cur.first.second]);
long long midval2 = midfun(v[cur.first.second], v[cur.second.second]);
// cout << midval1 <<cur.second.first <<cur.first.second << midval2 << cur.second.second;
auto res1 = bsearch(v, cur.second.first, cur.first.second, midval1);
auto res2 = bsearch(v, cur.first.second, cur.second.second, midval2);
pq.push(make_pair(res1, make_pair(cur.second.first, cur.first.second)));
pq.push(make_pair(res2, make_pair(cur.first.second, cur.second.second)));
// cout << res1.first <<res1.second <<cur.second.first<<cur.first.second << cur.second.second;
}
cout << pmin <<endl;
// your code here
}
return 0;
}