Header Ad

HackerEarth Failed ranges problem solution

In this HackerEarth Failed ranges problem solution You are given two sorted arrays A and B of sizes N and M respectively. C is the following:
  1. An array of size N∗M such that C[k]=(A[i]+B[j]) for all possible i and j.
  2. C is a sorted array.

HackerEarth Failed ranges problem solution


HackerEarth Failed ranges problem solution.

#include<bits/stdc++.h>
using namespace std;
#define FastRead ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define int long long int
#define ll int
#define endl '\n'
#define double double
#define ld double
#define FOR(i,a,n) for (ll i=(a);i<=(n);++i)
#define RFOR(i,a,n) for (ll i=(n);i>=(a);--i)
#define FI(i,n) for (ll i=0; i<(n); ++i)
#define ZERO(a) memset((a),0,sizeof((a)))
#define MINUS(a) memset((a),-1,sizeof((a)))
#define f first
#define s second
#define pb push_back
#define mk make_pair
#define all(g) g.begin(),g.end()
#define sz(x) (ll)x.size()
int fastMax(int x, int y) { return (((y-x)>>(32-1))&(x^y))^y; }
int fastMin(int x, int y) { return (((y-x)>>(32-1))&(x^y))^x; }

const int MAXN = 1e5 + 10;
int A[MAXN],B[MAXN];
int N,M,X,Y;

int greater_than_Xth(int K){
int s = 0,e = (A[N] + B[M]);
int ans = e;
while(s <= e){
int mid = (s+e)>>1;
int cnt = 0;
for(int i=1;i<=N;i++){
int req = mid - A[i];
cnt += upper_bound(B+1,B+M+1,req) - B - 1;
}
if(cnt >= K) ans = mid,e = mid-1;
else s = mid+1;
}
return ans;
}

int less_than_Yth(int K){
int s = 0,e = (A[N] + B[M]);
int ans = s;
while(s <= e){
int mid = (s+e)>>1;
int cnt = 0;
for(int i=1;i<=N;i++){
int req = mid - A[i];
cnt += upper_bound(B+1,B+M+1,req) - B - 1;
}
if(cnt < K) ans = mid,s = mid+1;
else e = mid-1;
}
return ans;
}

void solve(){
cin>>N>>M;

for(int i=1;i<=N;i++) cin>>A[i];
for(int i=1;i<=M;i++) cin>>B[i];

cin>>X>>Y;

int val_start = greater_than_Xth(X) + 1;
int val_end = less_than_Yth(Y);

vector<pair<int,int>> sol;

for(int i=1;i<=N;i++){
int req_start = val_start - A[i];
int idx_start = lower_bound(B+1,B+M+1,req_start) - B;

for(int j=idx_start;j<=M;j++){
if(A[i] + B[j] > val_end) break;
sol.push_back({i,j});
}
}

sort(all(sol));
cout<<sz(sol)<<endl;
for(auto x:sol) cout<<"("<<x.first<<","<<x.second<<") ";
}

signed main(){

FastRead;
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("ou.txt", "w", stdout);
#endif

int t = 1;
FOR(i,1,t){
solve();
}
}


Post a Comment

0 Comments