题目地址:http://poj.org/problem?id=1083
将区间端点离散化,排好序,从左向右,维护一个计数器,遇到区间起点+1,遇到区间终点-1,然后计数器曾得到的最大值*10就是答案了。
两个小地方注意一下:
1.因为(1,20)与(20,1)并没有区别,为了处理方便,我们不妨人为让区间起点<区间终点
2.注意到题目环境是一个走廊,所以room1和room2实际上是等价的,所以我们不妨把奇数房间号+1(我就因为这个跪了一次,做忘了不小心当成一条直线了。。。)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int t;
int a[450],soe[450];
int n;
void q_sort(int l,int r){
int i,j,x,y;
i=l;
j=r;
x=a[(l+r)>>1];
while (i<=j){
while (a[i]<x) i++;
while (a[j]>x) j--;
if (i<=j){
y=a[i];
a[i]=a[j];
a[j]=y;
y=soe[i];
soe[i]=soe[j];
soe[j]=y;
i++;j--;
}
}
if (l<j) q_sort(l,j);
if (i<r) q_sort(i,r);
}
int main(){
cin>>t;
for (int bibi=1;bibi<=t;bibi++){
cin>>n;
memset(a,0,sizeof(a));
memset(soe,0,sizeof(soe));
for (int i=1;i<=n;i++){
cin>>a[2*i-1]>>a[2*i];
if (a[2*i-1]>=a[2*i]){
int y=a[2*i-1];
a[2*i-1]=a[2*i];
a[2*i]=y;
}
if (a[2*i-1]%2!=0) a[2*i-1]++;
if (a[2*i]%2!=0) a[2*i]++;
//这里出了点问题,不小心搞成一条线了
soe[2*i-1]=1;
soe[2*i]=-1;
}
q_sort(1,2*n);
int Max=1,f=0;
for (int i=1;i<=n*2;i++){
f+=soe[i];
if (f>Max){Max=f;}
}
cout<<Max*10<<endl;
}
return 0;
}