➤ Problem Link : 1301B. Motarack's Birthday
✅ C++ Solution :
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
ll arr[4*100001];
ll n;
bool func(ll d)
{
ll l=0,r=pow(10,9)+5;
for(int i=1;i<=n;i++)
{
if(arr[i]!=-1)
continue;
if(arr[i-1]==-1 && arr[i+1]==-1)
continue;
if(arr[i-1]==-1 && arr[i+1]!=-1)
{
if(arr[i+1] >=l && arr[i+1]<=r)
{
l=max(l,arr[i+1]-d);
r=min(r,arr[i+1]+d);
continue;
}
if(arr[i+1]> r)
{
if(arr[i+1]-d > r)
return 0;
l=max(l,arr[i+1]-d);
}
else
{
if(arr[i+1]+d < l)
return 0;
r=min(r,arr[i+1]+d);
}
}
else if(arr[i+1]==-1 && arr[i-1]!=-1)
{
if(arr[i-1] >=l && arr[i-1]<=r)
{
l=max(l,arr[i-1]-d);
r=min(r,arr[i-1]+d);
continue;
}
if(arr[i-1]> r)
{
if(arr[i-1]-d > r)
return 0;
l=max(l,arr[i-1]-d);
}
else
{
if(arr[i-1]+d < l)
return 0;
r=min(r,arr[i-1]+d);
}
}
else
{
ll mn=min(arr[i-1],arr[i+1]);
ll mx=max(arr[i-1],arr[i+1]);
if(mn!=-1)
{
if(mn+d < l)
return 0;
r=min(r,mn+d);
}
if(mx!=-1)
{
if(mx-d > r)
return 0;
l = max(l,mx-d);
}
}
}
return 1;
}
ll fun2(ll d)
{
ll l=0,r=pow(10,9)+5;
for(int i=1;i<=n;i++)
{
if(arr[i]!=-1)
continue;
if(arr[i-1]==-1 && arr[i+1]==-1)
continue;
if(arr[i-1]==-1)
{
if(arr[i+1] >=l && arr[i+1]<=r)
{
l=max(l,arr[i+1]-d);
r=max(r,arr[i+1]+d);
continue;
}
if(arr[i+1]> r)
{
if(arr[i+1]-d > r)
return 0;
l=max(l,arr[i+1]-d);
}
else
{
if(arr[i+1]+d < l)
return 0;
r=min(r,arr[i+1]+d);
}
}
else if(arr[i+1]==-1)
{
if(arr[i-1] >=l && arr[i-1]<=r)
{
l=max(l,arr[i-1]-d);
r=max(r,arr[i-1]+d);
continue;
}
if(arr[i-1]> r)
{
if(arr[i-1]-d > r)
return 0;
l=max(l,arr[i-1]-d);
}
else
{
if(arr[i-1]+d < l)
return 0;
r=min(r,arr[i-1]+d);
}
}
else
{
ll mn=min(arr[i-1],arr[i+1]);
ll mx=max(arr[i-1],arr[i+1]);
if(mn!=-1)
{
if(mn+d < l)
return 0;
r=min(r,mn+d);
}
if(mx!=-1)
{
if(mx-d > r)
return 0;
l = max(l,mx-d);
}
}
}
return l;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
ll low=0,high=pow(10,9)+1;
arr[0]=arr[n+1]=-1;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
if(arr[i]!=-1 && arr[i-1]!=-1)
low=max(low,abs(arr[i]-arr[i-1]));
}
ll mid;
while(low<high)
{
mid=low+(high-low)/2;
if(func(mid))
high=mid;
else
low=mid+1;
}
// cout<<func(3)<<endl;
ll m = low;
ll k= fun2(m);
cout<<m<<" "<<k<<"\n";
}
}
Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook.
😇Happy Learning!!
