poj2528-Mayor's posters

题目链接 http://vjudge.net/problem/POJ-2528

 

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 10010
using namespace std;
int result;
int l[MAX_SIZE], r[MAX_SIZE];
bool mark[MAX_SIZE];
struct item {
    int coord;
    int id;
}poster[2*MAX_SIZE];
struct line {
    int left, right;
    int kind;
}lines[10*MAX_SIZE];
void build(int lf, int rg, int root)
{
    lines[root].left = lf;
    lines[root].right = rg;
    if(lf == rg) return ;
    int mid = (lf + rg) / 2;
    build(lf, mid, root*2);
    build(mid+1, rg, root*2+1);
}
void update(int s, int t, int root, int cover)
{
    if(s == lines[root].left && t == lines[root].right) {
        lines[root].kind = cover;
        return ;
    }
    if(lines[root].kind != 0 && lines[root].kind != cover) {
        lines[root*2].kind = lines[root].kind;
        lines[root*2+1].kind = lines[root].kind;
        lines[root].kind = 0;
    }
    int mid = (lines[root].left + lines[root].right) / 2;
    if(t <= mid) update(s, t, root*2, cover);
    else if(mid < s) update(s, t, root*2+1, cover);
    else {
        update(s, mid, root*2, cover);
        update(mid+1, t, root*2+1, cover);
    }
}
void cal(int root)
{
    if(lines[root].kind != 0) {
        if(mark[lines[root].kind] == false) {
            mark[lines[root].kind] = true;
            result++;
        }
    }
    else {
        if(lines[root].left != lines[root].right) cal(root*2);
        if(lines[root].left != lines[root].right) cal(root*2+1);
    }
}
int cmp(const void *p, const void *q)
{
    return ((item *)p)->coord - ((item *)q)->coord;
}
int main()
{
    int t, n, i, j;
    struct item *templ, *tempr, tl, tr;
    scanf("%d", &t);
    while(t--) {
        memset(lines, 0, sizeof(lines));
        memset(poster, 0, sizeof(poster));
        memset(mark, 0, sizeof(mark));
        scanf("%d", &n);
        for(i=j=1; i<=n; i++) {
            scanf("%d%d", &l[i], &r[i]);
            poster[j++].coord = l[i];
            poster[j++].coord = r[i];
        }
        qsort(poster+1, n*2, sizeof(item), cmp);
        for(i=j=1; i<=2*n; i++, j++) {
            poster[j].coord = poster[i].coord;
            poster[j].id = j;
            while(poster[i].coord == poster[i+1].coord) i++;
        }
        build(1, j-1, 1);
        for(i=1; i<=n; i++) {
            tl.coord = l[i];
            tr.coord = r[i];
            templ = (item *)bsearch(&tl, poster+1, j, sizeof(item), cmp);
            tempr = (item *)bsearch(&tr, poster+1, j, sizeof(item), cmp);
            update(templ->id, tempr->id, 1, i);
        }
        result = 0;
        cal(1);
        printf("%d\n", result);
    }
    return 0;
}

 

posted @ 2016-09-22 17:21  啊嘞  阅读(162)  评论(0编辑  收藏  举报