poj 2528 Mayor's posters

果的线段树,结合离散化
#include <stdio.h>
#include 
<string.h>
#include 
<stdlib.h>

struct node
{
    
int l, r, color;
}tree[
80010];
int n;
int x[10010], y[10010], t[10000010];
int point[20010], v[10010];

int cmp(const void *a, const void *b)
{
    
return *(int *)a-*(int *)b;
}

void build(int l, int r, int p)
{
    tree[p].l
= l;
    tree[p].r
= r;
    tree[p].color
= 0;
    
if ( l < r )
    {
        
int mid=(l+r)>>1;
        build(l, mid, 
2*p);
        build(mid
+1, r, 2*p+1);
    }
}

void insert(int l , int r , int p, int color)
{
    
if ( tree[p].l == l && tree[p].r == r)
    {
        tree[p].color
=color;
        
return;
    }
    
if (tree[p].color)
    {
        tree[
2*p].color= tree[2*p+1].color=tree[p].color;
        tree[p].color
=0;
    }
    
int mid= (tree[p].l+tree[p].r)>>1;
    
if (r <= mid) insert(l, r, 2*p, color);
    
else if (l > mid) insert(l, r, 2*p+1, color);
    
else
    {
        insert(l, mid, 
2*p, color);
        insert(mid
+1, r, 2*p+1, color);
    }
}

void find(int l, int r, int p)
{
    
if (tree[p].color)
    {
        v[tree[p].color]
=1;
        
return;
    }
    
int mid= (tree[p].l+tree[p].r)>>1;
    find(l, mid, 
2*p);
    find(mid
+1, r, 2*p+1);
}

int c;
int main()
{
    scanf(
"%d"&c);
    
while ( c-- )
    {
        scanf(
"%d"&n);
        memset(t, 
0sizeof(t));
        
int i, k=0;
        
for ( i = 1; i <= n; i++ )
        {
            scanf(
"%d%d", x+i, y+i);
            
if ( !t[x[i]] )
            {
                t[x[i]]
=1;
                point[
++k]=x[i];
            }
            
if ( !t[y[i]] )
            {
                t[y[i]]
=1;
                point[
++k]=y[i];
            }
        }
        qsort( point
+1, k, sizeof(int), cmp );
        
for( i= 1; i <= k; i++)
            t[point[i]]
=i;
        build(
1, k, 1);
        
for ( i = 1; i <= n; i++)
        {
            insert(t[x[i]], t[y[i]], 
1, i);
        }
        memset(v, 
0sizeof(v));
        find(
1, k ,1);
        
int sum=0;
        
for ( i = 1; i <=n ; i++)
            
if(v[i]) sum++;
        printf(
"%d\n", sum);
    }
    
return 0;
}

posted on 2011-08-03 17:41 purplest 阅读(227) 评论(0)  编辑 收藏 引用 所属分类: 线段树


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论