标签:des style blog http color os strong 数据
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
南阳理工 题目9:posters(离散化+线段树),布布扣,bubuko.com
标签:des style blog http color os strong 数据
原文地址:http://www.cnblogs.com/yym2013/p/3873414.html