您的位置:首页 > 其它

POJ 2528 Mayor's posters

2013-11-05 10:09 369 查看
本题的难点在于离散化,对于离散化由于做过这方面的题目做的并不是很多,其实离散化的目的就是使得给出数据便于处理的一种方法,从原始到目标数据的一一映射,相比于原始数据目标数据更容易处理,且目标数据仍然满足原始数据满足的一些条件,离散化的过程中往往用到排序,关键是怎样建立这种一一映射的关系,还得做几道相关的题目理解一下,本题的离散化也是非常的经典,具体看程序吧...

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 10010<<1;
const int INF  = 0x3f3f3f3f;

struct Node
{
    int num, id;
    Node() {}
    Node(int t_num, int t_id) : num(t_num), id(t_id) {}
    friend bool operator< (const Node &p1, const Node &p2)
    {
        return p1.num < p2.num;
    }
}p[MAXN];

int color[MAXN<<2];
int used[MAXN];
int segment[MAXN][2];
int c, n;

void PushDown(int rt, int len)
{
    if(color[rt])
    {
        color[rt<<1]   = color[rt];
        color[rt<<1|1] = color[rt];
        color[rt] = 0;
    }
    return ;
}

void Bulid(int l, int r, int rt)
{
    color[rt] = 0;
    if(l == r) return;
    int m = (l + r)>>1;
    Bulid(l, m, rt<<1);
    Bulid(m + 1, r, rt<<1|1);
    return ;
}

void Update(int L, int R, int col, int l, int r, int rt)
{
    if(L == l && R == r)
    {
        color[rt] = col;
        return ;
    }
    PushDown(rt, r - l + 1);
    int m = (l + r)>>1;
    if(R <= m)
        Update(L, R, col, l, m, rt<<1);
    else if(L > m)
        Update(L, R, col, m + 1, r, rt<<1|1);
    else
    {
        Update(L, m, col, l, m, rt<<1);
        Update(m + 1, R, col, m + 1, r, rt<<1|1);
    }
    return ;
}

void Query(int L, int R, int l, int r, int rt)
{
    if(L == l && R == r && color[rt])
    {
        used[color[rt]]++;
        return ;
    }
    PushDown(rt, r - l + 1);
    int m = (l + r)>>1;
    if(R <= m)
        Query(L, R, l, m, rt<<1);
    else if(L > m)
        Query(L, R, m + 1, r, rt<<1|1);
    else
    {
        Query(L, m, l, m, rt<<1);
        Query(m + 1, R, m + 1, r, rt<<1|1);
    }
    return ;
}

int main()
{
    //freopen("aa.in", "r", stdin);

    int cnt, ans;
    scanf("%d", &c);
    while(c--)
    {
        scanf("%d", &n);
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d %d", &p[2*i-1].num, &p[2*i].num);
            p[2*i-1].id = -i; p[2*i].id = i;
        }
        sort(p + 1, p + 2 * n + 1);
        cnt = 0; p[0].num = -INF;
        for(int i = 1; i <= 2*n; ++i)
        {
            if(p[i].num != p[i-1].num) cnt++;
            if(p[i].id < 0) segment[-p[i].id][0] = cnt;
            else segment[p[i].id][1] = cnt;
        }
        Bulid(1, cnt, 1);
        for(int i = 1; i <= n; ++i)
        {
            Update(segment[i][0], segment[i][1], i, 1, cnt, 1);
        }
        memset(used, 0, sizeof(used));
        Query(1, cnt, 1, cnt, 1);
        ans = 0;
        for(int i = 1; i <= n; ++i)
        {
            if(used[i] > 0) ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: