SSL-2124 涂色【离散】

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/79966385

大意

有一根长度为1000000000的棍子,一开始涂成白色。
棍子上有刻度,左端点为0,右端点1000000000。
由于某种原因这根棍子的某些部分被重新涂过了。
重新涂的颜色可能是黑色或着白色。
棍子总共被依次重新涂了N(1<=N<=5000)次。
找出最后最长的白色段。

思路

其实这题最棒棒的做法还是线段树啦,但本人蒟蒻只打了一个离散。就是把它按位置排个序,然后找一下就行啦

代码

#include<cstdio>
#include<algorithm>
#define r(i,a,b) for(int i=a;i<=b;i++)
#define d(i,a,b) for(int i=a;i>=b;i--)
using namespace std;int n,p,ansl,ansr,xl,xr;
int l[5001],r[5001],f[10001];char color[5001];
int main()
{
    l[0]=0;r[0]=1000000000;color[0]='w';//初始化
    scanf("%d",&n);
    r(i,1,n) 
    {
        scanf("%d %d ",&l[i],&r[i]);color[i]=getchar();getchar();//输入
        f[++p]=l[i];f[++p]=r[i];//保存位置
    }
    sort(f+1,f+1+p);//排序
    r(i,1,p)
     d(j,n,0)
      if((f[i-1]>=l[j])&&f[i]<=r[j])//满足范围
      {
        if(color[j]=='b')//若为白色
        {
            if(xr-xl>ansr-ansl) {ansl=xl;ansr=xr;}//保存最终答案
            xl=f[i];xr=f[i+1];//保存这次答案
        }
        else if(f[i-1]<=xr) xr=f[i];//因为黑色白色是交替出现的,若是黑色,则右边界可以直接跳到上一个点
        break;//因为j是倒着过来的,找到一个即为当次的最优解,所以可以不必再找,直接推出
      }
    if(xr-xl>ansr-ansl) {ansl=xl;ansr=xr;}//最后调整答案
    printf("%d %d",ansl,ansr);//输出
}
阅读更多

没有更多推荐了,返回首页