Mayor's posters POJ

来源:互联网 发布:红帽linux查看防火墙 编辑:程序博客网 时间:2024/05/18 13:09

链接:http://poj.org/problem?id=2528
题意:在一个长度不超过10000000的区间内贴海报,因为贴的过程中会有覆盖的问题, 假如第一次贴[1, 4], 第二次贴[2, 6],就会覆盖住[2, 4]部分,问贴完所有海报后能看到多少张海报。

解题思路:因为数据量太大,故要对所给出的数据先进行离散化比如(1, 2, 5, 6, 8, 10),离散化以后为(1, 2, 3, 4, 5, 6), 然后考虑到覆盖问题,为了实现方便我选择从最后一张海报往前贴,问题转化为区间是否已经被占有,对于贴区间又可以转化为对于点的操作,即对于区间[1, 4]之间的线段可以转化为点[1, 3]。(写代码的时候没有考虑太多,而且题目很水)
ps:离散中有需要注意的点:假如第一次贴[1, 7], 第二次贴[1, 3], [5, 7], 正常离散的方法就会错(题目太水,而且好像正确做法会wa)

贴一个ac的代码(实际上是错的)

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define LL long long#define lson ins<<1#define rson ins<<1|1#define merge tree[ins]=tree[lson]+tree[rson]#define mid (r+l)/2using namespace std;const int Max = 200052;int Hash[Max], ans;struct node{    int x, y;}data[Max>>1];struct Tree {    int l, r;    LL sum, lazy;} tree[Max << 2];inline void build(int l, int r, int ins) {    tree[ins].l = l, tree[ins].r = r, tree[ins].sum = tree[ins].lazy = 0;    if (r > l) {        build(l, mid, lson);        build(mid + 1, r, rson);    }}inline int updata_tree(int ql, int qr, int ins) {    int l = tree[ins].l, r = tree[ins].r;    if (ql <= l && r <= qr){        if(tree[ins].sum==0){            tree[ins].sum=1;            return 1;        }        return 0;    }    else if(!tree[ins].sum){        int flag=0;        if (ql <= mid)if(updata_tree(ql, qr, lson))flag=1;        if (qr > mid)if(updata_tree(ql, qr, rson))flag=1;        if(tree[lson].sum&&tree[rson].sum)tree[ins].sum=1;        return flag;    }    return 0;}int main() {    int T;    scanf("%d", &T);    while(T--){        ans=0;        int n, mem=1;        scanf("%d", &n);        for(int a=1; a<=n; a++){            scanf("%d%d", &data[a].x, &data[a].y);            Hash[mem++]=data[a].x;            Hash[mem++]=data[a].y-1;        }        sort(Hash+1, Hash+mem);        mem=unique(Hash+1, Hash+mem)-(Hash+1);        build(1, mem, 1);        for(int a=n; a>=1; a--){            int l=lower_bound(Hash+1, Hash+mem+1, data[a].x)-Hash;            int r=lower_bound(Hash+1, Hash+mem+1, data[a].y)-Hash;            ans+=updata_tree(l, r-1, 1);        }        printf("%d\n", ans);    }    return 0;}/*131 71 35 72 */