sgu 177 Square 矩形切割

这篇博客介绍了如何解决一个n*n矩形中,通过染色子矩形来统计白色单位方格数量的问题。作者最初认为可能需要使用二维线段树,但后来了解到可以通过矩形切割的方法来解决。这种方法涉及倒序扫描每个矩形,判断并处理重叠部分,最终计算未被覆盖的面积。博客提供了实现算法的代码作为参考。
摘要由CSDN通过智能技术生成

    n*n的矩形,由1*1的单位方格构成,先可以对其中的子矩形染色(黑或白),染色完成后,有多少个白色单位方格?第一次做这种题,第一眼看上去感觉应该是二维线段树....后来在网上查了查这类覆盖,统计的问题可以用矩形切割来写,果断学习到了新的姿势...大致思路就是倒着扫描每个矩形,处理每个矩形时,向后遍历判断后面的矩形是否与其重叠,重叠的话就分割冲若干种小的矩形继续处理,直到最后统计没有被覆盖的面积..实现直接看代码吧..

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
typedef long long ll;
int n,m;
int x1[10020],x2[10020],y1[10020],y2[10020];
int col[10020];
char c[3];
int cnt;
void slove(int xs,int ys,int xt,int yt,int d,int c)
{

    while (((xs>=x2[d])||(xt<=x1[d])||(ys>=y2[d])||(yt<=y1[d]))&& d<=m) d++;
    if (d==m+1)
    {
        if (c) cnt+=(yt-ys)*(xt-xs);
        return;
    }
    if (xs<x1[d])
    {
        slove(xs,ys,x1[d],yt,d+1,c);
        xs=x1[d];
    }
    if (xt>x2[d])
    {
        slove(x2[d],ys,xt,yt,d+1
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值