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