码迷,mamicode.com
首页 > 其他好文 > 详细

上浮法或漂浮法

时间:2015-05-01 22:24:37      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

题意:给一张白纸,按顺序往上面贴有颜色且不透明的矩形,求最后能看到的颜色以及每种颜色的面积。

思路:对每个矩形而言,它最后能有多少被看见,取决于它后面的矩形。所以从后往前处理,就像一个矩形从最底下上浮,碰到它上面的矩形就分成若干块,到水面上时更新答案。递归表示剩余的可见矩形,然后模拟上浮过程。

技术分享
 1 struct Node {
 2     int x1, y1, x2, y2, color;
 3     void inp() {
 4         scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &color);
 5         x1 ++;
 6         y1 ++;
 7     }
 8 };
 9 Node node[1007];
10 int n, cnt[2600];
11 
12 void dfs(int pos, int color, int l, int r, int u, int d) {
13     while (pos < n && (node[pos].x2 < l || node[pos].x1 > r || node[pos].y1 > u || node[pos].y2 < d)) pos ++;
14     if (pos == n) {
15         cnt[color] += (r - l + 1) * (u - d + 1);
16         return ;
17     }
18     if (l < node[pos].x1) { dfs(pos + 1, color, l, node[pos].x1 - 1, u, d); l = node[pos].x1; }
19     if (r > node[pos].x2) { dfs(pos + 1, color, node[pos].x2 + 1, r, u, d); r = node[pos].x2; }
20     if (d < node[pos].y1) { dfs(pos + 1, color, l, r, node[pos].y1 - 1, d); d = node[pos].y1; }
21     if (u > node[pos].y2) { dfs(pos + 1, color, l, r, u, node[pos].y2 + 1); u = node[pos].y2; }
22 }
23 
24 int main() {
25     //freopen("in.txt", "r", stdin);
26     int T, a, b;
27     cin >> T;
28     while (T--) {
29         cin >> a >> b >> n;
30         rep_up0(i, n) {
31             node[i].inp();
32         }
33         mem0(cnt);
34         rep_down0(i, n) {
35             dfs(i + 1, node[i].color, node[i].x1, node[i].x2, node[i].y2, node[i].y1);
36         }
37         int sum = 0;
38         rep_up1(i, 2500) sum += cnt[i];
39         cnt[1] += a * b - sum;
40         rep_up1(i, 2500) {
41             if (cnt[i]) {
42                 printf("%d %d\n", i, cnt[i]);
43             }
44         }
45     }
46     return 0;
47 }
View Code

 

上浮法或漂浮法

标签:

原文地址:http://www.cnblogs.com/jklongint/p/4471242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!