51nod 1091 线段的重叠
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。
给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。
Input
第1行:线段的数量N(2 <= N <= 50000)。 第2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)
Output
输出最长重复区间的长度。
Input示例
5 1 5 2 4 2 8 3 7 7 9
Output示例
4
线段相交只有三种情况
包含 被包含 相交
写个函数判断
主程序维护五十个最有可能出现最大重叠的数据
动态更新
参数是玄学
虽然只用了46ms
但是是非稳定算法
只是打出来验证想法
以后尽量不用
#include <iostream>
using namespace std;
int arra[105] = {0};
int arrb[105] = {0};
int fun(int fst,int lst, int ta, int tb)
{
int tmplen;
if(ta >= fst && ta <= lst && tb <= lst)
{
//cout<<1<<endl;
tmplen = tb - ta;
}
else if(ta >= fst && ta <= lst && tb >= lst)
{
//cout<<2<<endl;
tmplen = lst - ta;
}
else if(tb >= fst && tb <= lst && ta <= fst)
{
//cout<<3<<endl;
tmplen = tb - fst;
}
else if(ta > lst || tb < fst)
{
tmplen = 0;
}
else
{
//cout<<4<<endl;
tmplen = lst - fst;
}
return tmplen;
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
int ta, tb, maxlen = 0, tmplen,flag = 0;
int fst,lst;
cin>>ta>>tb;
arra[0] = ta;
arrb[0] = tb;
n --;
while(n--)
{
cin>>ta>>tb;
for(int i = 0; i < 50; i++)
{
tmplen = fun(arra[i],arrb[i],ta,tb);
//cout<<tmplen<<endl;
if(tmplen > maxlen)
{
maxlen = tmplen;
}
}
if(tb - ta > arrb[flag] - arra[flag] - 1000 || maxlen == 0)
{
flag++;
if(flag == 50)
flag = 0;
arra[flag] = ta;
arrb[flag] = tb;
}
}
cout<<maxlen<<endl;
return 0;
}