poj 2528 Mayor's posters(线段树+离散化)

来源:互联网 发布:网络教育专业是什么 编辑:程序博客网 时间:2024/04/30 12:15

题意:有一块足够长的墙了给竞选人贴海报,后贴的可能会把衣面贴的给覆盖掉,问最有多少不同的海报是能看到的。

思路:线段树,因为坐标范围太大,无法表示,得离散化。

1.如何离散化。个人觉得 离散化是件危险的事,因为每次都会漏掉特殊情况,如此题
若样列为
1 6
1 2
5 6
用unique离散后就得如下对应关系
1 1 2 5 6 6

   1 2  3
如此求得的答案是能看见2块poster 因为它略去了中间的【3 4】段。但poj没有这样的测试数据,所以依然能过

所以离散化一定要特别特别注意区间被忽略的情况!!!!!。我用的方法是浪费一倍的空间,增加比它大一的点
如上例 pos 数组里将变以
pos : 1 1 2 2 2 3 5 6 6 6 7 7  离散化后为
                       2 3       5
这样原来漏掉的区点就由2这个点代替。

2.如何解些题。若按照它给的poster的顺序从前往后贴,你会发现无从下手,但是逆来,先贴后面的,贴它前一poster的时候,只要判断它的区间是否已被覆盖,覆盖了就不能再贴(因为是先把后来的poster给贴了)。
//1944K    47MS#include <stdio.h>#include <string.h>#include <algorithm>#define L(u) (u<<1)#define R(u) (u<<1|1)const int M = 10005;using namespace std;struct Node{    int l,r;    int cover;}node[M<<4];struct Seg{    int x,y;}seg[M];int pos[M<<2];void Build (int u,int left,int right){    node[u].l = left,node[u].r = right;    node[u].cover = 0;    if (node[u].l == node[u].r)        return ;    int mid = (node[u].l + node[u].r)>>1;    Build (L(u),left,mid);    Build (R(u),mid+1,right);}void Pushup(int u) //如果叶子都被覆盖了,则父结点的cover = 1{    if (node[L(u)].cover & node[R(u)].cover)        node[u].cover = 1;}bool Query(int u,int left,int right){    if (node[u].cover)        return false;    if (pos[node[u].l] == left&&pos[node[u].r] == right)//离散化后的映射关系    {        node[u].cover = 1;        return true;    }    int mid  = (node[u].l + node[u].r)>>1;    bool flag;    if (right <= pos[mid]) flag = Query(L(u),left,right);    else if (left >= pos[mid+1]) flag = Query(R(u),left,right);    else flag =  Query(L(u),left,pos[mid])|Query(R(u),pos[mid+1],right);    Pushup(u);    return flag;}int main (){    #ifdef LOCAL        freopen("in.txt","r",stdin);    #endif    int i,T,n,x,y,m;    scanf ("%d",&T);    while (T --)    {        scanf ("%d",&n);        int k = 0;        for (i = 0;i < n;i ++)        {            scanf ("%d%d",&seg[i].x,&seg[i].y);  //点增加1,避免离散化后,区间为遗漏            pos[k++] = seg[i].x,pos[k++] = seg[i].y;            pos[k++] = seg[i].x+1,pos[k++] = seg[i].y+1;        }        sort (pos,pos + k);        m = (unique(pos,pos+k) - pos - 1);        Build (1,0,m);        int ans = 0;        for (i = n-1;i >= 0;i --)        {            if (Query(1,seg[i].x,seg[i].y))                ans ++;        }        printf ("%d\n",ans);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 丈夫车祸死亡妻子和孩子以后怎么办 丈夫死后妻子改嫁儿子不同意怎么办 满了60岁社保没满15年怎么办 捷豹的dpf灯亮了怎么办 朋友如新直销产品是你该怎么办 传福音接受了却被家人拦阻该怎么办 奶奶出钱由孙子抓奖中奖后怎么办 我不想学车了驾校不同意退学怎么办 2017年大学挂科面临退学怎么办 微信重新登录后东西全没了怎么办 宝宝吃鸡蛋过敏全身起红疹怎么办 180在产蛋鸡因断鸡减产怎么办 住友39熔接机熔接损耗大怎么办 支付宝实名认证刷脸失败怎么办 支付宝注册刷脸不是本人怎么办 小学科学只考88分中学怎么办 收银机关机时才上传数据是怎么办 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办 容留他人吸毒时签了强戒怎么办 拘留后发现被拘留是人大代表怎么办 执行局要拘留人找不到人怎么办 开设赌场罪拘留37天了该怎么办