Timus 1019

做了这道题我都快疯了,一开始不是道什么是散列化,看了半天才有点头绪,尝试写了,又遇到了问题,就是排序之后,如何确定新的区间,看看大牛的文章,就是看不懂,今天早上突然,灵光一闪,知道到底怎么回事了,也就是在排序的过程中,记录了染色区间的序号,以便于,散列后重新确定染色区间,就这么简单却弄了那么久,汗颜。后来,没有注意到题中给出的条件 起始点< 终点,是我一直在纠结始点等于终点的情况,唉!还有就是英语本身就不怎么样,竟然还忽略了另一个条件“open interval”,查了一下却是“开区间”的意思,导致我就是弄不明白sample output 中的47  634 是怎么来的,自己总认为是48  634,唉,真是无语了,直到此时,才感觉到以前考虑的许多细节都可以不考虑了,其实本题也在有意的降低难度。

#include<iostream>

#include<cstring>

#include<cstdio>

#include<algorithm>

using namespace std;

struct node

{

    int sign,pos;

}vert[20001];

int start[10001],finish[10001],res[10001];

char color[10001];

int cmp(node a,node b)

{

    return a.pos<b.pos;

}

int GetLast(int s,int e)

{

    int i;

    for(i=s+1;i<=e;i++) 

        if(vert[i].pos!=vert[i-1].pos) return i-1;

    return e;

}

int recolor(int s,int e,char c)

{

    int i;

    if(c=='w')

        for(i=s;i<=e;i++) res[i]=0;

    if(c=='b')

        for(i=s;i<=e;i++) res[i]=1;

    return 0;

}

int main()

{

    int i,n,max,first,last,s,t;

    while(scanf("%d",&n)!=EOF)

    {

        for(i=1;i<=n;i++)

        {

            scanf("%d %d %c",&start[i],&finish[i],&color[i]);

            vert[i].sign=-i;

            vert[i].pos=start[i];

            vert[n+i].sign=i;

            vert[n+i].pos=finish[i];

        }

        sort(vert+1,vert+1+2*n,cmp);

        vert[0].pos=0; vert[2*n+1].pos=1000000000;

        first=0;

        for(i=1;i<=2*n;i++)

        {

            if(vert[i].pos!=vert[i-1].pos)

            {

                first=i;

                last=GetLast(i,2*n);

                if(vert[i].sign<0)  

                    start[-vert[i].sign]=first;

                else 

                    finish[vert[i].sign]=last;    

            }

            else

            {

                if(vert[i].sign<0)

                    start[-vert[i].sign]=first;

                else

                    finish[vert[i].sign]=last;

            }

        }

        for(i=1;i<=n;i++) recolor(start[i],finish[i]-1,color[i]);

        first=0; res[2*n+1]=1;

        max=0;

        for(i=1;i<=2*n+1;i++)

        {

            if(res[i]==0 && res[i]!=res[i-1])

            {

                first=vert[i].pos;

            }

            if(res[i]==1 && res[i]!=res[i-1])

            {

                last=vert[i].pos;

                if(max<last-first+1){ max=last-first+1; s=first; t=last;}

            }

        }

        printf("%d %d\n",s,t);

    }

    return 0;

}

你可能感兴趣的:(IM)