用线段树实现了下 但是发现更好的一种方法
1. 将起始点与终点放在一起
2. 然后排序
3. 然后记录一个maxBeginCount 记录最大连续起始点的次数
4. 在记录currentBeginCount 记录当前连续起始点的次数 如果当前是起始点 则加1 如果是终点 则减1
5. 当超过maxBeginCount时候 则替换maxBeginCount 记录当前的起始点
6. 遇到下一个终点时候 则除2 得到平均数 或者直接返回起始点也可以
资料:
1. http://haixiaoyang.wordpress.com/2012/03/19/find-the-point-intersect-with-most-intervals/
2. http://blog.youkuaiyun.com/beiyeqingteng/article/details/7405921
#include <iostream>
#include <vector>
#include <algorithm>
struct point
{
bool isStart;
double val;
point(bool eIsStart, double eVal): isStart(eIsStart), val(eVal)
{}
bool operator < (const point& p)
{
if(val == p.val)
{
if(isStart && !p.isStart)
return true;
}
return val < p.val;
}
};
double findPoint(double begins[], double ends[], int n)
{
std::vector<point> vec;
for(int i = 0; i < n; i++)
{
vec.push_back(point(true, begins[i]));
vec.push_back(point(false, ends[i]));
}
std::sort(vec.begin(), vec.end());
int maxBegins = 0;
int curBegins = 0;
double maxBeginRes = 0;
double res;
for(int i = 0; i < n; i++)
{
if(vec[i].isStart)
{
curBegins++;
if(curBegins > maxBegins)
{
maxBegins = curBegins;
maxBeginRes = vec[i].val;
}
}
else
{
if(curBegins == maxBegins)
{
res = (maxBeginRes + vec[i].val) / 2;
curBegins--;
}
}
}
return res;
};
int main()
{
int cnt = 0;
std::cin >> cnt;
double begins[100];
double ends[100];
int i = 0;
while(i < cnt)
{
int b, e;
std::cin >> b >> e;
begins[i] = b;
ends[i] = e;
i++;
}
double res = findPoint(begins, ends, cnt);
return 0;
}
改进线段树算法实现高效区间操作
1116

被折叠的 条评论
为什么被折叠?



