/*
HDOJ 1199
先离散化,然后再搜索最长的白色区间
只存白色区间,是黑的时候,处理过程要将各种情况分清楚。
本体看起来就是可以用区间树的,可惜我还不会咯
*/
#include <iostream>
#include <algorithm>
using namespace std;
struct white
{
int x;
int y;
}s[3000];
bool cmp(white a,white b)
{
if(a.x != b.x)
return (a.x<b.x);
else
return (a.y<b.y);
}
int main()
{
int N,a,b,i,j,temp,len,num;
int ansa,ansb,anslen;
char c;
while(cin>>N)
{
num=0;
for(i=0;i<3000;i++)
{
s[i].x = -1;
s[i].y = -1;
}
for(i=0;i<N;i++)
{
cin>>a>>b>>c;
if(c == 'w')
{
s[num].x=a;
s[num].y=b;
num++;
}
else
{
temp=num;
for(j=0;j<temp;j++)
{
if((a <= s[j].x)&&(b >= s[j].y))
{
s[j].x=-1;
s[j].y=-1;
}
else if((a <= s[j].x)&&(b >= s[j].x)&&(b <= s[j].y))
s[j].x=b+1;
else if((a >= s[j].x)&&(a <= s[j].y)&&(b >= s[j].y))
s[j].y=a-1;
else if((a >= s[j].x)&&(b <= s[j].y))
{
s[num].x=b+1;
s[num].y=s[j].y;
s[j].y=a-1;
num++;
}
}
}
}
sort(s,s+num,cmp);
len=-1;
anslen=-1;
ansa=-1;
ansb=-1;
for(i=0;i<num;i++)
{
if(s[i].x >= -1)
{
a=s[i].x;
b=s[i].y;
len=b-a+1;
i++;
for(;i<num;i++)
{
if(s[i].x <= (b+1)) //这里要为b+1,保证连续性
{
if(b < s[i].y)
b=s[i].y;
len=b-a+1;
}
else
{
if(len > anslen)
{
ansa=a;
ansb=b;
anslen=len;
}
a=s[i].x;
b=s[i].y;
len=b-a+1;
}
}
if(len > anslen)
{
ansa=a;
ansb=b;
anslen=len;
}
break;
}
}
if(anslen == -1)
cout<<"Oh, my god"<<endl;
else
cout<<ansa<<" "<<ansb<<endl;
}
return 0;
}
离散化——HDOJ 1199
最新推荐文章于 2019-05-14 21:41:43 发布