涂色 [离散]

题目

     

涂色

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 }

 

posted @ 2018-12-08 10:25  Melted_czj  阅读(211)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色