Shaping Regions USACO 3.1

 这题不会,直接的看的题解,方法很多,不过感觉都没见过啊,选了第一个漂浮法看了好久才搞懂

漂浮法

以逆序来进行放置,即n to 1。逆序的好处在于放置一个矩形后,俯视看到的就是最终俯视该矩形应该看到的。因为挡着它的矩形在之前已经放置好了,所以可直接统计,为递归创造了条件。每放一个矩形,可以想象成将其扔入一密度很大的海水底部,海分成了n层,然后矩形开始向上浮。在上浮过程中若碰撞到其他的矩形则断裂成几个小矩形,继续上浮,直到浮出水面。于是想到用个递归来模拟上浮过程。

  解释下,就是倒过来放,先放最上面一个,因为水面无拦截的矩形,直接飘到水面,被看到全部-----对应最后画的矩形肯定没有被覆盖

然后是倒数第二个,放到水底,快要到水面时,如果和上面的有交界.假设与上面的矩形重叠的部分会被留下(相当于被盖住了),额外的部分被切割后继续上浮,被看到.随后重复...注意上浮过程是个迭代过程,会和上面的每一层产生一次切割过程(有相交就切割).

  关键是切割后,继续上浮的面积怎么求。看NOCOW第一个解法,看了好久才搞懂.先上个图

黑色方块代表上面的遮挡矩形,下方的矩形产生的切割后上浮部分,可以完全划分到这1-4个区域中(区域组合有多种,这是一种)。

1区域产生上浮部分的条件是ly<y1[h],即下面矩形的ly<黑色的ly。

可能有人要问若ry<黑色的ly不是完全没有切割?即使这样也满足在1区域的条件。

2 3 4同理...

然后是可以看到这4个区域黑线一个边界外,每个区域还有一条红线作为边界,

同样要满足这个约束条件,对1来说,右边的红线表示1里的上浮矩形的x坐标不能超过黑色矩形的rx

1区域的上浮矩形的lx=min(OriginalLx,BlackRx),rx=min(OriginalRx,BlackRx),不管怎样就是不能越过BlackRx,同时 ry<BlackLy...

可能又有人要问若OriginalLx,OriginalRx,都大于BlackRx此时上浮不是1跳条线,没有了?

此时说明上浮矩形跑到了2区域,同理2区域会做相同处理,不用担心...

真是难,照着别人代码敲的,大牛们的脑子里长的啥,搞不懂啊搞不懂

 1 /*
 2 
 3 ID: hubiao cave
 4 
 5 PROG: rect1
 6 
 7 LANG: C++
 8 
 9 */
10 
11 
12 
13 
14 #include<iostream>
15 
16 #include<fstream>
17 
18 #include<string>
19 
20 using namespace std;
21 
22 
23 int x1[1002],y11[1002],x2[1002],y2[1002],color[1002]={1},cnt[2502],N;
24 
25 void cover(int lx,int ly,int rx,int ry,int c,int h);
26 int main()
27 
28 {
29 
30 
31     ifstream fin("rect1.in");
32 
33     ofstream fout("rect1.out");
34     
35     fin>>x2[0]>>y2[0]>>N;//最下面的那块
36     for(int i=1;i<=N;i++)
37         fin>>x1[i]>>y11[i]>>x2[i]>>y2[i]>>color[i];
38     cnt[color[N]]+=(y2[N]-y11[N])*(x2[N]-x1[N]);//最上面一层直接确定
39     for(int i=N-1;i>=0;i--)
40         cover(x1[i],y11[i],x2[i],y2[i],color[i],i+1);
41     
42     for(int i=1;i<=2500;++i)
43         if(cnt[i])
44         fout<<i<<" "<<cnt[i]<<endl;
45 
46     return 0;
47 
48 
49 }
50 void cover(int lx,int ly,int rx,int ry,int c,int h)
51 {
52     if(lx==rx||ly==ry)
53         return;
54     if(h>N)
55         cnt[c]+=(rx-lx)*(ry-ly);
56     else
57     {
58         if(ly<y11[h])
59             cover(min(lx,x2[h]),ly,min(rx,x2[h]),min(y11[h],ry),c,h+1);
60         if(rx>x2[h])
61             cover(max(x2[h],lx),min(y2[h],ly),rx,min(y2[h],ry),c,h+1);
62         if(ry>y2[h])
63             cover(max(lx,x1[h]),max(y2[h],ly),max(rx,x1[h]),ry,c,h+1);
64         if(lx<x1[h])
65             cover(lx,max(y11[h],ly),min(x1[h],rx),max(y11[h],ry),c,h+1);
66     }
67 
68 }
原文地址:https://www.cnblogs.com/cavehubiao/p/3339369.html