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