程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> URAL 1019 - Line Painting

URAL 1019 - Line Painting

編輯:C++入門知識

跟前面某個題一樣,都是區間染色問題,還是用我的老方法,區間離散化+二分區間端點+區間處理做的,時間跑的還挺短

 

 

 \
 

坑爹的情況就是最左端是0,最右端是1e9,區間求的是開區間

#include <stdio.h>   
#include <string.h>   
#include <math.h>   
#include <algorithm>   
using namespace std;  
typedef struct  
{  
    int l;  
    int r;  
    bool color;  
}seg;  
seg a[5005];  
int t[10005];  
int d[10005],ct;  
int f[10005];  
  
int find(int x,int n)  
{  
    int l=0,r=n-1,mid=(l+r)/2;  
    while(l<r)  
    {  
        if(x>d[mid])l=mid+1;  
        else r=mid;  
        mid=(l+r)/2;  
    }  
    return mid;  
}  
  
int main()  
{  
    int n;  
        scanf("%d",&n);  
        for(int i=0;i<n;i++)  
        {  
            char e;  
            scanf("%d %d %c",&t[2*i],&t[2*i+1],&e);  
            a[i].l=t[2*i];  
            a[i].r=t[2*i+1];  
            a[i].color=(e=='w')?0:1;  
        }  
        t[2*n]=0;t[2*n+1]=1e9;  
        sort(t,t+2*n+2);  
        ct=0;  
        d[ct++]=t[0];  
        for(int i=1;i<2*n+2;i++)  
            if(t[i]!=t[i-1])  
            d[ct++]=t[i];  
        memset(f,0,sizeof(f));  
        for(int i=0;i<n;i++)  
        {  
               int L=find(a[i].l,ct);  
               int R=find(a[i].r,ct);  
               for(int j=L;j<R;j++)  
                f[j]=a[i].color;  
        }  
        int left=0;  
        int max=0,a1,a2;  
        for(int i=0;i<ct;i++)  
        {  
            if(f[i]==1||d[i]==1e9)  
            {  
                if(left==d[i]){left=d[i+1];continue;}  
                else {  
                        if(d[i]-left>max){  
                                max=d[i]-left;  
                                a1=left;  
                                a2=d[i];  
                        }  
                        left=d[i+1];  
                }  
            }  
        }  
        printf("%d %d\n",a1,a2);  
    return 0;  
}  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved