BestCoder Round #20 B

来源:互联网 发布:出国英文翻译软件 编辑:程序博客网 时间:2024/05/18 01:10

题目大意:输入T表示测试用例数,接下来输入N,表示有N组数据,每组有x,y表示X轴上的一段线段,最后找出被这N条线段覆盖最多的点的覆盖次数。

算法思想:

每条线段[x,y],可以理解为【x,y+1)的左闭右开的区间,从x点开始覆盖次数加1,当点到y+1时之前的覆盖结束覆盖次数-1。基于此思想,可以将所有的x,y+1排序,然后找出这2N个数的最大字段和,又因为x<=y,所以又可以理解为求最大前缀和问题。

代码如下:

#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN=200050;typedef struct {    int xy;//记录x或y坐标    int value;}Locate;Locate line[MAXN];bool cmp(Locate a,Locate b){    if(a.xy<b.xy)return true;    return false;}int main(){    int T,N,x,y,k;    cin>>T;    while(T--){      cin>>N;      k=0;      for(int i=0;i<N;i++){          cin>>x>>y;          line[k].xy=x;          line[k].value=1;          k++;          line[k].xy=y+1;          line[k].value=-1;          k++;      }      sort(line,line+k,cmp);      int ans=0;      int num=0;      for(int i=0;i<k;i++){          ans+=line[i].value;          num=max(ans,num);      }      cout<<num<<endl;    }    return 0;}


0 0