• 涂色 [离散]


    题目

         

    涂色

    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 }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    sicily 山海经 线段树实例
    常用位运算
    广度优先搜索有环图
    线性O(N)时间复杂度求素数 , 筛法
    sicily2014
    机器学习中相似性度量(转载)
    VS2010中Parallel的使用
    CKeditor与Asp.net验证控件的问题
    将div一直保持到页面底部
    利用DataAnnotations验证实体(类)的属性
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10086688.html
Copyright © 2020-2023  润新知