1 5 1 4 2 6 8 10 3 4 7 10
4
离散化+线段树。
难度较高的一道线段树的题,用了离散化处理。在南阳理工学院的oj(http://acm.nyist.net/JudgeOnline/problem.php?pid=9)上提交成功,但是在poj上提交WA,不知道为什么……听说poj上测试数据有些问题,还要算上端点两侧的点??不清楚,有知道的同仁告诉我一下,拜谢。。。
题意:
按顺序给你一些海报,这些海报可能相互重叠,求最后没有被完全盖住的海报的数量。
给你海报的两个端点的位置,最多有10000张海报,但是位置最多可以是10000000。
思路:
由于涉及到区间,首先应该想到线段树,但是海报的宽度太大,如果给你一个1-10000000大小的海报怎么办?肯定MLE超内存啊(这的new多少节点)。所以就要用到离散化的方法,听起来很神秘,但理解起来很简单,例如给你两张海报,[1,6]和[3,10],排序之后是1,3,6,10,离散化为1,2,3,4,即第一个区间为[1,3],第二个区间为[2,4],如此,创建一个[1,4]的线段树即可,而不用创建[1,10]的线段树,节省了空间。
代码:
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <algorithm>
5 using namespace std; 6
7 #define MAXN 20000
8 bool tree[MAXN*4+1]; //存储区间有无海报
9 short hash[10000010]; //离散化后的端点位置
10 short x[MAXN+10]; //存储海报的两个端点
11 struct post{ 12 short L; 13 short R; 14 }a[MAXN+10]; //原数组
15 int cnt; //记录露在外面的海报数量
16
17 bool Insert(int d,int L,int R,int l,int r) 18 { 19 if(tree[d]) 20 return false; 21 if(L==l && R==r){ //找到区间
22 tree[d] = true; 23 return true; 24 } 25
26 int mid = (L+R)/2; 27 bool res; 28 if(mid>=r){ 29 res = Insert(d<<1,L,mid,l,r); 30 } 31 else if(mid<l){ 32 res = Insert(d<<1|1,mid+1,R,l,r); 33 } 34 else { 35 bool f1 = Insert(d<<1,L,mid,l,mid); 36 bool f2 = Insert(d<<1|1,mid+1,R,mid+1,r); 37 res = f1||f2; 38 } 39 if(tree[d<<1] && tree[d<<1|1]) 40 tree[d] = true; 41 return res; 42 } 43
44 int main() 45 { 46 int T; 47 scanf("%d",&T); 48 while(T--){ 49 memset(tree,0,sizeof(tree)); 50 memset(hash,0,sizeof(hash)); 51 memset(x,0,sizeof(x)); 52 int i,n,nCount=0; 53
54 //输入
55 scanf("%d",&n); 56 for(i=0;i<n;i++){ 57 scanf("%d%d",&a[i].L,&a[i].R); 58 x[nCount++] = a[i].L; 59 x[nCount++] = a[i].R; 60 } 61
62 sort(x,x+nCount); 63 nCount = unique(x,x+nCount) - x; //去重
64
65 int key=1; 66 for(i=0;i<nCount;i++){ //离散化处理
67 hash[x[i]] = key; 68 if(i<nCount-1){ 69 if(x[i+1]-x[i]==1) 70 key++; 71 else
72 key=key+2; 73 } 74 } 75
76 cnt = 0; 77 for(i=n-1;i>=0;i--){ 78 if(Insert(1,1,key,hash[a[i].L],hash[a[i].R])) //将离散化后的海报插入到线段树中
79 cnt++; 80 } 81 printf("%d\n",cnt); 82 } 83 return 0; 84 }
Freecode : www.cnblogs.com/yym2013