1301B. Motarack's Birthday - Codeforces Solution C++

  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!!