基准时间限制: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; }