• 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 }
  • 相关阅读:
    R绘图 第七篇:绘制条形图(ggplot2)
    R实战 第11篇:处理缺失值
    R实战 第十篇:列联表和频数表
    贝叶斯概率
    分析思维 第三篇:数据分析的三板斧
    分析思维 第二篇:数据指标体系
    分析思维 第一篇:认识数据
    R数据挖掘 第三篇:聚类的评估(簇数确定和轮廓系数)和可视化
    R数据挖掘 第二篇:基于距离评估数据的相似性和相异性
    R数据挖掘 第一篇:聚类分析(划分)
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3339369.html
Copyright © 2020-2023  润新知