POJ 2528 Mayor's posters

这道题的离散化很巧妙,参考了胡浩大神的代码。自己先理解下

http://www.notonlysuccess.com/ 大神的博客

/*Accepted    1120K    79MS    C++    2109B    2012-07-24 17:40:47*/

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;



#define lson l, m, rt << 1

#define rson m + 1, r, rt << 1 | 1



const int MAXN = 11111;

int li[MAXN], ri[MAXN];

int col[MAXN << 4];

int X[MAXN << 2];

int cnt;

bool hash[MAXN];



void PushDown( int rt)

{

    if( col[rt] != -1)

    {

        col[rt << 1] = col[rt << 1 | 1] = col[rt];

        col[rt] = -1;

    }

}



void update( int L, int R, int c, int l, int r, int rt)

{

    int m = (l + r) >> 1;

    if( L <= l && r <= R)

    {

        col[rt] = c;

        return;

    }

    PushDown(rt);

    if( L <= m) update( L, R, c, lson);

    if( R > m) update( L, R, c, rson);

}



void query( int l, int r, int rt)

{

    if( col[rt] != -1){

        if( !hash[col[rt]]) cnt ++;

        hash[col[rt]] = true;

        return;

    }

    if( l == r) return;

    int m = (l + r) >> 1;

    query(lson);

    query(rson);

}



int BS( int key, int n, int X[])

{

    int l = 0, r = n - 1;

    while( l <= r)

    {

        int m = (l + r) >> 1;

        if( key == X[m]) return m;

        if( X[m] < key) l = m + 1;

        else r = m - 1;

    }

    return -1;

}



int main()

{

    int T;

    int n, nn, m;

    scanf( "%d", &T);

    while( T --){

        cnt = 0;

        scanf( "%d", &n);

        nn = 0;

        for( int i = 0; i < n; i ++)

        {

            scanf( "%d%d", &li[i], &ri[i]);

            X[nn ++] = li[i];

            X[nn ++] = ri[i];

        }

        sort( X, X + nn);

        int m = 1;

        for( int i = 1; i < nn; i ++)

            if( X[i] != X[i - 1]) X[m ++] = X[i];

        for( int i = m - 1; i > 0; i --)

            if( X[i] != X[i - 1] + 1) X[m ++] = X[i - 1] + 1;

        sort(X, X + m);

        memset( col, -1, sizeof col);

        memset( hash, false, sizeof hash);

        for( int i = 0; i < n; i ++)

        {

            int l = BS( li[i], m, X);

            int r = BS( ri[i], m, X);

            update( l, r, i, 0, m, 1);

        }

        query( 0, m, 1);

        printf( "%d\n", cnt);

    }

    return 0;

}

你可能感兴趣的:(post)