usaco-3.1-PROB Shaping Regions-漂浮法

漂浮法,顾名思义,就是一块块的往上飘。

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

/*
ID: rowanha3
LANG: C++
TASK: rect1
*/
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<math.h>
#include<map>
#include<set>
#include<string>
using namespace std;
int n;
struct list
{
    int x1,y1;
    int x2,y2;
    int cl;
    friend bool operator < (const list &a,const list &b){
        return a.cl<b.cl;
    }
}rec[1100];
int ans[3001];
void dos(int x1,int y1,int x2,int y2,int color,int y)
{
    if(x1>=x2||y1>=y2)return;
    if(y>n)
    {
        ans[color]+=(x2-x1)*(y2-y1);
        return;
    }
    struct list p;
    p=rec[y];
    if(y1<p.y1)dos(max(p.x1,x1),y1,max(p.x1,x2),min(p.y1,y2),color,y+1);
    if(y2>p.y2)dos(min(x1,p.x2),max(y1,p.y2),min(p.x2,x2),y2,color,y+1);
    if(x1<p.x1)dos(x1,min(p.y2,y1),min(p.x1,x2),min(p.y2,y2),color,y+1);
    if(x2>p.x2)dos(max(p.x2,x1),max(p.y1,y1),x2,max(p.y1,y2),color,y+1);
}
int main(){
    freopen("rect1.in","r",stdin);
    freopen("rect1.out","w",stdout);
    int a,b,i;
    scanf("%d%d%d",&a,&b,&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d%d%d%d",&rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2,&rec[i].cl);
    }
    rec[0].x1=0;
    rec[0].y1=0;
    rec[0].x2=a;
    rec[0].y2=b;
    rec[0].cl=1;
    memset(ans,0,sizeof(ans));
    for(i=n;i>=0;i--)
    {
        dos(rec[i].x1,rec[i].y1,rec[i].x2,rec[i].y2,rec[i].cl,i+1);
    }
    for(i=1;i<=3000;i++)
    {
        if(ans[i])
        {
            cout<<i<<" "<<ans[i]<<endl;
        }
    }
    return 0;
}

usaco-3.1-PROB Shaping Regions-漂浮法,码迷,mamicode.com

时间: 2024-10-26 22:08:31

usaco-3.1-PROB Shaping Regions-漂浮法的相关文章

Shaping Regions

Shaping Regions Time limit: 0.5 secondMemory limit: 64 MB N opaque rectangles (1 ≤ N ≤ 1000) of various colors are placed on a white sheet of paper whose size is A wide by B long. The rectangles are put with their sides parallel to the sheet's border

Shaping Regions(dfs)

Shaping Regions Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 39[Submit][Status][Web Board] Description N opaque rectangles (1 <= N <= 1000) of various colors are placed on a white sheet of paper whose size is A wide by B long. The rec

ural1147(Shaping Regions)矩形切割

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1147 题意:一个10000*10000的矩阵,初始颜色都为1,然后最多2500次涂色,每次涂色将一个矩形的面积涂成某个特定颜色,问涂完之后每种颜色最终的面积. 解法:倒序计算,矩形切割 代码: /****************************************************** * @author:xiefubao **************************

ural 1147. Shaping Regions

1147. Shaping Regions Time limit: 0.5 secondMemory limit: 64 MB N opaque rectangles (1 ≤ N ≤ 1000) of various colors are placed on a white sheet of paper whose size is A wide by B long. The rectangles are put with their sides parallel to the sheet's

USACO window area 漂浮法

这道题是求解几个矩形未被遮挡的面积问题, 可以使用漂浮法来解决, 什么事漂浮法请看这里http://www.nocow.cn/index.php/USACO/window, 代码如下: /* ID: m1500293 LANG: C++ PROG: window */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[80]; int buttom,

上浮法或漂浮法

题意:给一张白纸,按顺序往上面贴有颜色且不透明的矩形,求最后能看到的颜色以及每种颜色的面积. 思路:对每个矩形而言,它最后能有多少被看见,取决于它后面的矩形.所以从后往前处理,就像一个矩形从最底下上浮,碰到它上面的矩形就分成若干块,到水面上时更新答案.递归表示剩余的可见矩形,然后模拟上浮过程. 1 struct Node { 2 int x1, y1, x2, y2, color; 3 void inp() { 4 scanf("%d%d%d%d%d", &x1, &y

关于DFS的一点总结

今天在刷 USACO 2.1 PROB Healthy Holsteins 这题需要以这种方式搜索 1 ~ n 以n = 4 为例: 搜索顺序为: (1),(2),(3),(4), (1,2),(1,3),(1,4) ,(2,3),(2,4),(3,4) (1,2,3),(1,2,4) , (1,3,4) (1,2,3,4) -- 因为每次搜索的数字位数不同,所以需要用到递归. 递归在这里是决定循环层数的(循环和递归决定的维度不同) 但是这种dfs一直不会写. 今天看了别人的代码,死啃很久,St

USACO Chapter 1 Section 1.1

USACO的题解和翻译已经很多了... 我只是把自己刷的代码保存一下. 1.PROB Your Ride Is Here 1 /* 2 ID:xiekeyi1 3 PROG:ride 4 LANG:C++ 5 */ 6 7 #include<bits/stdc++.h> 8 using namespace std ; 9 10 int main() 11 { 12 freopen("ride.in","r",stdin); 13 freopen(&quo

USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】

holstein解题报告 ------------------------------------------------------------------------------------------------------------------------------------------------[题目] 你需要给一头奶牛制定最优的喂养计划. 有V种维他命,每天对于每种维他命,牛都有需要达到的指标: 同时你有G种饲料,编号依次为1到G,每种维他命在每种饲料中所蕴含的量都会给你.