POJ 2528 Mayor's posters

来源:互联网 发布:淘宝开店简介 编辑:程序博客网 时间:2024/06/15 10:05

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


#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;}