➤ Problem Link : 1029C. Maximal Intersection
✅ C++ Solution :
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
int n;
cin>>n;
pair<ll,ll> arr[n+1];
for(int i=1;i<=n;i++)
cin>>arr[i].first>>arr[i].second;
pair<ll,ll> cuml[n+2];
pair<ll,ll> cumr[n+2];
cuml[0]=make_pair(LONG_MIN,LONG_MAX);
cumr[n+1]=make_pair(LONG_MIN,LONG_MAX);
ll left,right;
for(ll i=1;i<=n;i++)
{
if(cuml[i-1]==make_pair((ll)-1,(ll)-1))
cuml[i]=cuml[i-1];
else
{
if(arr[i].first > cuml[i-1].second || arr[i].second < cuml[i-1].first)
cuml[i]=make_pair(-1,-1);
else
{
left=max(cuml[i-1].first,arr[i].first);
right=min(cuml[i-1].second,arr[i].second);
cuml[i]=make_pair(left,right);
}
}
}
for(ll i=n;i>=1;i--)
{
if(cumr[i+1]==make_pair((ll)-1,(ll)-1))
cumr[i]=cumr[i+1];
else
{
if(arr[i].first > cumr[i+1].second || arr[i].second < cumr[i+1].first)
cumr[i]=make_pair(-1,-1);
else
{
left=max(cumr[i+1].first,arr[i].first);
right=min(cumr[i+1].second,arr[i].second);
cumr[i]=make_pair(left,right);
}
}
}
ll ans=0;
for(ll i=1;i<=n;i++)
{
pair<ll,ll> a = cuml[i-1];
pair<ll,ll> b = cumr[i+1];
if(a==make_pair((ll)-1,(ll)-1) || b==make_pair((ll)-1,(ll)-1))
continue;
if(a.first > b.second || a.second < b.first)
continue;
left = max(a.first,b.first);
right= min(a.second,b.second);
ans=max(ans,right-left);
// cout<<i<<" "<<left<<" "<<right<<" "<<ans<<endl;
}
cout<<ans;
}
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!!
