题目
有一根棍子,一开始涂成白色, 由于某种原因这根棍子的某些部分被重新涂过了, 重新涂的颜色可能是黑色或者白色,找出最后最长的白色段。
分析
离散,分离所有的起始点和终点,匹配到每一个区间时,倒着枚举(有顺序的),求出最大值。
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
int n,a[5001],b[5001],x[10001],y[10001],l,r,sta,end; char s[5001];
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int main(){
n=in(); a[0]=0; b[0]=1000000000; s[0]='w';
for (int i=1;i<=n;i++){
a[i]=in(); b[i]=in(); s[i]=getchar();
x[(i<<1)-1]=a[i]; x[i<<1]=b[i];
}
stable_sort(x+1,x+2*n+1);
for (int i=0;i<2*n;i++)
for (int j=n;j>=0;j--)
if (x[i]>=a[j]&&x[i+1]<=b[j]){
if (s[j]=='b'){
if (r-l>end-sta) sta=l,end=r;//找最大区间
l=x[i+1]; r=x[i+2];//黑色往后移
}
else if (x[i]<=r) r=x[i+1];//往后扩大
break;
}
if (r-l>end-sta) sta=l,end=r;//找最大区间
return !printf("%d %d",sta,end);
}