USACO Section 5.3 Window Area - 又一矩形覆盖问题

56 篇文章 0 订阅
29 篇文章 0 订阅


    最重要的问题..如何确定这些矩形的重叠层次顺序...我通过给每个矩形一个权值来表示当前矩形的优先级..只有当这个矩形某区域上有重合部分的矩形优先级都比这个矩形低..这个区域才说是从正面可以看到的面积...而这个优先级的操作:

       用maxn表示当前优先级的最大值...用minn表示当前优先级的最小值..maxn与minn的初始值都为0..

       当输入一个矩形..按题目的要求其优先值就应该比前面已经在那得所有矩形都高..所以他的优先级为maxn+1..且maxn随后++...

       当要将一个矩形置顶时..同样..将这个矩形的优先级更新为maxn+1..且maxn随后++...

       当要将一个矩形置底时..那么将这个矩形的优先值设定为比其他所有的优先级都低..所以为minn-1...且随后minn--..

       当要删除一个矩形..我是直接标记为这个举行不存在..因为题目所给的所有矩形的点都是正整数..所以我标记为matrix[i].x0=0..

    做好这些操作..那么就是在第三章写过的通过递归求矩形覆盖问题的面积了...很简单...


Program:

/*  
ID: zzyzzy12   
LANG: C++   
TASK: window
*/      
#include<iostream>      
#include<istream>  
#include<stdio.h>     
#include<string.h>      
#include<math.h>      
#include<stack>
#include<map>
#include<algorithm>      
#include<queue>   
#define oo 2000000005  
#define ll long long  
#define pi (atan(2)+atan(0.5))*2 
using namespace std;
struct node
{
      int x0,y0,x1,y1,t;      
}matrix[75];
char c;
int k,p,maxn,minn,m;
double ans; 
void getdata(int i,int x0,int y0,int x1,int y1)
{ 
      if (x0>=x1 || y0>=y1) return;
      for (;i<=75;i++)  
         if (matrix[i].x0 && matrix[i].t>matrix[k].t) break;
      if (i==76)
      {
            m+=(x1-x0)*(y1-y0); 
            return;                  
      }
      getdata(i+1,x0,y0,min(x1,matrix[i].x0),y1);
      getdata(i+1,max(x0,matrix[i].x1),y0,x1,y1);
      getdata(i+1,max(x0,matrix[i].x0),max(y0,matrix[i].y1),min(x1,matrix[i].x1),y1);
      getdata(i+1,max(x0,matrix[i].x0),y0,min(x1,matrix[i].x1),min(y1,matrix[i].y0)); 
      return; 
}
int main()  
{  
      freopen("window.in","r",stdin);   
      freopen("window.out","w",stdout); 
      memset(matrix,0,sizeof(matrix));
      maxn=minn=0;
      while (~scanf("%c",&c))
      {
             if (c=='w')
             {
                   scanf("%c%c",&c,&c);
                   if (c>='0' && c<='9') k=60+c-'0';
                    else
                       if (c>='a') k=c-'a'+1;
                           else k=c-'A'+27;   
                   scanf(",%d,%d,%d,%d",&matrix[k].x0,&matrix[k].y0,&matrix[k].x1,&matrix[k].y1);
                   if (matrix[k].x0>matrix[k].x1)
                   {
                           p=matrix[k].x0; 
                           matrix[k].x0=matrix[k].x1;              
                           matrix[k].x1=p;         
                   } 
                   if (matrix[k].y0>matrix[k].y1)
                   {
                           p=matrix[k].y0; 
                           matrix[k].y0=matrix[k].y1;              
                           matrix[k].y1=p;                                                  
                   }
                   matrix[k].t=++maxn;
             }else
             if (c=='t')
             {
                   scanf("%c%c",&c,&c);
                   if (c>='0' && c<='9') k=60+c-'0';
                    else
                       if (c>='a') k=c-'a'+1;
                           else k=c-'A'+27;                  
                   matrix[k].t=++maxn;
             }else
             if (c=='b')
             {
                   scanf("%c%c",&c,&c);
                   if (c>='0' && c<='9') k=60+c-'0';
                    else
                       if (c>='a') k=c-'a'+1;
                           else k=c-'A'+27;  
                   matrix[k].t=--minn;                          
             }else
             if (c=='d')
             {
                   scanf("%c%c",&c,&c);
                   if (c>='0' && c<='9') k=60+c-'0';
                    else
                       if (c>='a') k=c-'a'+1;
                           else k=c-'A'+27;
                   matrix[k].x0=0;
                                           
             }else
             if (c=='s')
             {
                   scanf("%c%c",&c,&c);
                   if (c>='0' && c<='9') k=60+c-'0';
                    else
                       if (c>='a') k=c-'a'+1;
                           else k=c-'A'+27;  
                   ans=(matrix[k].x1-matrix[k].x0)*(matrix[k].y1-matrix[k].y0);
                   m=0;
                   getdata(1,matrix[k].x0,matrix[k].y0,matrix[k].x1,matrix[k].y1);
                   ans=m/ans*100; 
                   printf("%.3lf\n",ans);                        
             }            
      }
      return 0;     
}   


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值