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;
}
posted @ 2012-04-29 12:20  书山有路,学海无涯  阅读(174)  评论(0编辑  收藏  举报