题目大意:
有一根长度为1000000000的棍子,一开始涂成白色。
棍子上有刻度,左端点为0,右端点1000000000。
由于某种原因这根棍子的某些部分被重新涂过了。
重新涂的颜色可能是黑色或着白色。
棍子总共被依次重新涂了N(1<=N<=5000)次。
找出最后最长的白色段。
解题思路:
正解似乎是线段树
离散化走起–
按照每次涂色的位置(横纵坐标)排序
然后找最长白色段
源程序:
#include<cstdio>
#include<algorithm>
using namespace std;int n,p,ansl,ansr,left,right;
int l[5001],r[5001],f[10001];char color[5001];
int main()
{
l[0]=0;r[0]=1000000000;color[0]='w';
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d %d ",&l[i],&r[i]);
color[i]=getchar();getchar();
f[i*2-1]=l[i];f[i*2]=r[i];
}
sort(f+1,f+n*2+1);
for (int i=1;i<=n*2;i++)
for (int j=n;j>=0;j--)
if((f[i-1]>=l[j])&&f[i]<=r[j])
{
if(color[j]=='b')
{
if(right-left>ansr-ansl)
{ansl=left;ansr=right;}
left=f[i];right=f[i+1];
}
else if(f[i-1]<=right) right=f[i];
break;
}
if(right-left>ansr-ansl)
{ansl=left;ansr=right;}
printf("%d %d",ansl,ansr);
return 0;
}