Shirlies
宁静专注认真的程序媛~

一道线段树的题目,由于之前没怎么做过线段树的题目,这道题我觉得还是有点小难的

首先将x坐标排序,然后找相邻的x坐标之间的最大y值和最小y值,这些矩形是要覆盖x,x+1坐标的,然后将yMax,yMin分散到线段树上,并用一个值标记哪些节点被分布了,最后查找一遍就可以了。

代码如下:
  1 #include <iostream>
  2 #include <algorithm>
  3 #include <cstring>
  4 using namespace std;
  5 
  6 int X_axle[20000];
  7 
  8 struct node
  9 {
 10     int xLow,xHigh,yLow,yHigh;
 11 }Point[10010];
 12 struct node1
 13 {
 14     int low,high;
 15     int value;
 16 }seg[300];
 17 
 18 int xCount;
 19 int pCount;
 20 int num,ans;
 21 
 22 void init1(int r,int l,int h)
 23 {
 24     seg[r].value = 0;
 25     seg[r].low = l;
 26     seg[r].high = h;
 27 
 28     if(l == h)
 29     {
 30         return;
 31     }
 32     int m = (l+h) >> 1;
 33     init1(r*2,l,m);
 34     init1(r*2+1,m+1,h);
 35 }
 36 
 37 void init(int& x1,int& y1,int& x2,int& y2)
 38 {
 39     if(x1 > x2) swap(x1,x2);
 40     if(y1 > y2) swap(y1,y2);
 41     X_axle[xCount ++] = x1;
 42     X_axle[xCount ++] = x2;
 43     Point[pCount].xLow = x1;
 44     Point[pCount].xHigh = x2;
 45     Point[pCount].yLow = y1;
 46     Point[pCount ++].yHigh = y2;
 47 }
 48 
 49 bool cmp(const int& a,const int& b)
 50 {
 51     return a < b;
 52 }
 53 
 54 void seg_tree(int root,int low,int high)
 55 {
 56     if(seg[root].low == low && seg[root].high == high)
 57     {
 58         seg[root].value = num;
 59         return;
 60     }
 61     int mid = (seg[root].low + seg[root].high) >> 1;
 62     if(high <= mid )
 63     {
 64         seg_tree(root*2,low,high);
 65     }else if(low > mid)
 66     {
 67         seg_tree(root*2+1,low,high);
 68     }else
 69     {
 70         seg_tree(root*2,low,mid);
 71         seg_tree(root*2+1,mid+1,high);
 72     }
 73 }
 74 
 75 void get_ans(int root,int low,int high)
 76 {
 77     if(seg[root].value == num)
 78     {
 79         ans += (seg[root].high - seg[root].low +1);
 80         return;
 81     }
 82      if(seg[root].low == seg[root].high) return;
 83     int mid = (low + high) >> 1;
 84     get_ans(root*2,low,mid);
 85     get_ans(root*2+1,mid+1,high);
 86 }
 87 int main()
 88 {
 89     int x1,y1,x2,y2;
 90     init1(1,0,100);
 91     num = 0;
 92 
 93     while(cin >> x1 >> y1 >> x2 >> y2)
 94     {
 95         xCount = 0;
 96         pCount = 0;
 97         init(x1,y1,x2,y2);
 98 
 99         while(cin >> x1 >> y1 >> x2 >> y2)
100         {
101             if(x1 == -1 || x2 == -2)
102             {
103                 break;
104             }
105              init(x1,y1,x2,y2);
106         }
107         sort(X_axle,X_axle+xCount,cmp);
108 
109         int ans_value = 0;
110         for(int i = 0;i < xCount-1;i ++)
111         {
112             if(X_axle[i] == X_axle[i+1]) continue;
113             num ++;
114 
115             for(int j = 0;j < pCount;j ++)
116             {
117                 if(Point[j].xLow <= X_axle[i] && Point[j].xHigh >= X_axle[i+1])
118                 {
119                     seg_tree(1,Point[j].yLow+1,Point[j].yHigh);
120                 }
121             }
122             ans = 0;
123             get_ans(1,0,100);
124             ans_value += ans * (X_axle[i+1] - X_axle[i]);
125         }
126         cout << ans_value << endl;
127         if(x1 == -2)
128         {
129             break;
130         }
131     }
132     return 0;
133 }
posted on 2012-11-29 14:24  Shirlies  阅读(332)  评论(0编辑  收藏  举报