class Solution {
public:
int segTree[400007];
vector<int>baskets;
void build(int p,int l,int r){
if(l == r){
segTree[p] = baskets[l];
return ;
}
int mid = (l + r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
segTree[p] = max(segTree[p<<1],segTree[p<<1|1]);
}
int query(int p,int l,int r,int ql,int qr){
if(ql > r || qr < l)
return INT_MIN;
if(ql <= l && r <= qr)
return segTree[p];
int mid = (l + r)>>1;
return max(query(p<<1,l,mid,ql,qr),query(p<<1|1,mid+1,r,ql,qr));
}
void update(int p,int l,int r,int pos,int val){
if(l==r){
segTree[p] = val;
return ;
}
int mid = (l + r)>>1;
if(pos <= mid){
update(p<<1,l,mid,pos,val);
}
else{
update(p<<1|1,mid+1,r,pos,val);
}
segTree[p] = max(segTree[p<<1],segTree[p<<1|1]);
}
int numOfUnplacedFruits(vector<int>& fruits, vector<int>& baskets) {
this->baskets = baskets;
int m = baskets.size();
int count = 0;
if(m == 0)
return fruits.size();
build(1,0,m-1);
for(int i = 0;i<m;i++){
int l= 0, r = m-1,res = -1;
while(l<= r){
int mid = (l + r)>>1;
if(query(1,0,m-1,0,mid)>=fruits[i])
{
res = mid;
r = mid - 1;
}
else{
l = mid +1;
}
}
if(res!=-1 && baskets[res] >= fruits[i]){
update(1,0,m-1,res,INT_MIN);
}
else count++;
}
return count;
}
};
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter