题目
涂色
Time Limit:10000MS Memory Limit:65536K
Total Submit:87 Accepted:60
Case Time Limit:1000MS
Description
有一根长度为1000000000的棍子,一开始涂成白色。
棍子上有刻度,左端点为0,右端点1000000000。
由于某种原因这根棍子的某些部分被重新涂过了。
重新涂的颜色可能是黑色或着白色。
棍子总共被依次重新涂了N(1<=N<=5000)次。
找出最后最长的白色段。
Input
第1行一个数N。
接下来N行表示一次涂色,格式如下:
ai bi ci
ai和bi为整数,ci是字母b或w。
表示把ai和bi之间那段涂成ci色(w白色,b黑色)。
0<=ai<=bi<=1000000000。
Output
一行,两个数x和y(x<y)。表示最长的白色段的起点和终点。 <br="">如果有多个最长的段,输出x最小的一个。
Sample Input
4
1 999999997 b
40 300 w
300 634 w
43 47 b
Sample Output
47 634
分析
注意,这根棍子刚开始就已经是白色的
离散
代码
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int x[100010000]; 5 int flag[100010000]; 6 struct sb 7 { 8 int a,b; 9 char c; 10 }t[5020]; 11 int main () 12 { 13 int n; 14 cin>>n; 15 int mx=0; 16 for (int i=1;i<=n;i++) // 离散 17 { 18 cin>>t[i].a>>t[i].b>>t[i].c; 19 x[2*i-1]=t[i].a; 20 x[2*i]=t[i].b; 21 } 22 sort(x+1,x+1+2*n); // 排序 23 for (int i=1;i<=2*n;i++) 24 for (int j=1;j<=n;j++) 25 if (x[i]>=t[j].a&&x[i]<t[j].b) 26 flag[i]=(int)t[j].c; 27 int h=0,maxx=0; 28 int wz1=0,wzz1=0,wzz2=0; 29 char bl='b',wh='w'; 30 for (int i=1;i<=2*n;i++) 31 { 32 33 if (flag[i]==(int)wh) //计算 34 { 35 if (wz1==0) 36 wz1=x[i]; 37 h+=x[i+1]-x[i]; 38 } 39 else 40 { 41 if (h>maxx) //找最大 42 { 43 maxx=max(h,maxx); 44 wzz1=wz1; 45 wzz2=x[i]; 46 } 47 wz1=0; 48 h=0; 49 } 50 } 51 cout<<wzz1<<" "<<wzz2; 52 }