Ural 1019. A Line painting

Ural 1019. A Line painting
线段树:

#include < iostream >
using   namespace  std;

int  N,Len;
struct  arr{
    
int  x,y,c;
};
struct  Node{
    
int  a,b;
    
int  cover;
}tree[
600000 ];
arr a[
5101 ],b[ 10010 ],c[ 5101 ];
int  hash[ 10010 ];
arr ans[
10010 ];
int  cmp( const   void *  no1, const   void *  no2){
    arr 
* nox = (arr * )no1, * noy = (arr * )no2;
    
return  nox -> -  noy -> x;
}
void  build( int  Num, int  la, int  lb){
    tree[Num].a
= la;
    tree[Num].b
= lb;
    tree[Num].cover
= 2 ;
    
if (la < lb){
        
int  mid = (la + lb) >> 1 ;
        build(Num
<< 1 ,la,mid);
        build((Num
<< 1 ) + 1 ,mid + 1 ,lb);
    }
}
void  insert( int  Num, int  la, int  lb, int  col){
    
if (tree[Num].a == la && tree[Num].b == lb){
        tree[Num].cover
= col;
        
return ;
    }
    
int  lc = Num << 1 ,rc = (Num << 1 ) + 1 ;
    
if (tree[Num].cover > 0 ){
        tree[lc].cover
= tree[Num].cover;
        tree[rc].cover
= tree[Num].cover;
    }
    tree[Num].cover
=- 1 ;
    
int  mid = (tree[Num].a + tree[Num].b) >> 1 ;
    
if (lb <= mid) insert(lc,la,lb,col);
    
else   if (la > mid) insert(rc,la,lb,col);
    
else {
        insert(lc,la,mid,col);
        insert(rc,mid
+ 1 ,lb,col);
    }
}
int  query( int  Num, int  la, int  lb){
    
if (tree[Num].cover > 0 && tree[Num].a <= la && tree[Num].b >= lb)
        
return  tree[Num].cover;
    
int  mid = (tree[Num].a + tree[Num].b) >> 1 ;
    
if (lb <= mid) 
        
return  query(Num << 1 ,la,lb);
    
else   if (la > mid)  return  query((Num << 1 ) + 1 ,la,lb);
}
int  main()
{
    scanf(
" %d " , & N); getchar();
    
int  lb = 0 ;
    
char  ch;
    b[
0 ].x =- 1 ;
    a[
0 ].x = 0 ; a[ 0 ].y = 1000000000 ; a[ 0 ].c = c[ 0 ].c = 2 ;
    lb
++ ; b[lb].x = a[ 0 ].x; b[lb].y = 0 ; b[lb].c = 0 ;
    lb
++ ; b[lb].x = a[ 0 ].y; b[lb].y = 0 ; b[lb].c = 1 ;
    
for ( int  i = 1 ;i <= N; ++ i){
        scanf(
" %d%d%c%c " , & a[i].x, & a[i].y, & ch, & ch); getchar();
        
if (ch == ' b ' ) a[i].c = 1 ;
        
else  a[i].c = 2 ;
        c[i].c
= a[i].c;
        lb
++ ; b[lb].x = a[i].x; b[lb].y = i; b[lb].c = 0 ;
        lb
++ ; b[lb].x = a[i].y; b[lb].y = i; b[lb].c = 1 ;
    }
    qsort(b
+ 1 ,lb, sizeof (arr),cmp);
    Len
= 0 ;
    memset(hash,
0 , sizeof (hash));
    
for ( int  i = 1 ;i <= lb; ++ i){
        
if (b[i].x != b[i - 1 ].x) Len ++ ;
        
if (b[i].c)
            c[b[i].y].y
= Len;
        
else
            c[b[i].y].x
= Len;
        hash[Len]
= b[i].x;
    }
    build(
1 , 1 ,Len - 1 );
    
for ( int  i = 1 ;i <= N; ++ i)
        insert(
1 ,c[i].x,c[i].y - 1 ,c[i].c);
    
for ( int  i = 1 ;i < Len; ++ i){
        ans[i].c
= query( 1 ,i,i);
        ans[i].x
= i;
        ans[i].y
= i + 1 ;
    }
    ans[Len].x
= Len - 1 ; ans[Len].y = Len; ans[Len].c = 2 ;
    
int  ax,ay,ac,bx,by,bc,col;
    ax
= ay = ac = 0 ;
    
int  k;
    
for (k = 1 ;k <= Len; ++ k)
        
if (ans[k].c == 2 ){
            bx
= ans[k].x;
            by
= ans[k].y;
            bc
= hash[ans[k].y] - hash[ans[k].x] + 1 ;
            col
= 2 ;
            
break ;
        }
    
for (k ++ ;k <= Len; ++ k)
        
if (ans[k].c == 1 ){
            
if (ac < bc){
                ax
= bx; ay = by; ac = bc;
            }
            bc
= 0 ; col = 1 ;
        }
        
else {
            
if (col == 1 ){
                bx
= ans[k].x; by = ans[k].y;
                bc
= hash[ans[k].y] - hash[ans[k].x] + 1 ;
                col
= 2 ;
            }
            
else {
                by
= ans[k].y;
                bc
= hash[by] - hash[bx] + 1 ;
            }
        }
        
if (ac < bc){
            ax
= bx; ay = by; ac = bc;
        }
        printf(
" %d %d\n " ,hash[ax],hash[ay]);
    
return   0 ;
}

线段切割:
#include < iostream >
using   namespace  std;

int  N;
struct  arr{
    
int  x,y,c;
}a[
5001 ],ans[ 1500001 ];
int  tot;
void  cut( int  h, int  t, int  cur){
    
while (cur <= N && (a[cur].x >= t || a[cur].y <= h)) cur ++ ;
    
if (cur > N){
        tot
++ ;
        ans[tot].x
= h; ans[tot].y = t; ans[tot].c = t - h + 1 ;
        
return ;
    }
    
if (h < a[cur].x && t > a[cur].x)
        cut(h,a[cur].x,cur
+ 1 );
    
if (h < a[cur].y && t > a[cur].y)
        cut(a[cur].y,t,cur
+ 1 );
}
int  cmp( const   void *  no1, const   void * no2){
    arr 
* nox = (arr * )no1, * noy = (arr * )no2;
    
if (nox -> x != noy -> x)  return  nox -> x - noy -> x;
    
else   return  nox -> y - noy -> y;
}
int  main()
{
    
char  s[ 2 ];
    a[
0 ].x = 0 ; a[ 0 ].y = 1000000000 ; a[ 0 ].c = 1 ;
    scanf(
" %d " , & N);
    
for ( int  i = 1 ;i <= N; ++ i){
        scanf(
" %d%d%s " , & a[i].x, & a[i].y,s);
        
if (s[ 0 ] == ' b ' ) a[i].c = 0 ;
        
else  a[i].c = 1 ;
    }
    tot
= 0 ;
    
for ( int  i = 0 ;i <= N; ++ i)
        
if (a[i].c) 
            cut(a[i].x,a[i].y,i
+ 1 );
    qsort(ans
+ 1 ,tot, sizeof (arr),cmp);
    
int  ax,ay,ac,bx,by,bc;
    ax
= bx = ans[ 1 ].x;
    ay
= by = ans[ 1 ].y;
    ac
= bc = ans[ 1 ].c;
    
for ( int  i = 2 ;i <= tot; ++ i)
        
if (by < ans[i].x){
            
if (ac < bc){
                ax
= bx; ay = by; ac = bc;
            }
            bx
= ans[i].x; by = ans[i].y; bc = ans[i].c;
        }
        
else   if (by == ans[i].x){
            by
= ans[i].y;
            bc
= by - bx + 1 ;
        }
    
if (ac < bc){
        ax
= bx; ay = by; ac = bc;
    }
    printf(
" %d %d\n " ,ax,ay);
    
return   0 ;
}




你可能感兴趣的:(Ural 1019. A Line painting)