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