SSL 2124 涂色

题目

有一根棍子,一开始涂成白色, 由于某种原因这根棍子的某些部分被重新涂过了, 重新涂的颜色可能是黑色或者白色,找出最后最长的白色段。


分析

离散,分离所有的起始点和终点,匹配到每一个区间时,倒着枚举(有顺序的),求出最大值。


代码

#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);
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80024006