POJ-1177 Picture

线段树+扫描线+离散化

扫描线是用于求解矩形覆盖面积或者矩形并轮廓长度的算法,一般都是搭配线段树使用

再加上离散化,可以把时间优化到最少

附上一个讲扫描线挺详细的链接:https://blog.csdn.net/qq_38786088/article/details/78633478

#include
#include
#include
#include
#include

using namespace std;
const int maxn=10000+10;

struct line
{
    int x,y1,y2;
    int f;
    bool operator < (const line &u) const
    {
        return x>1;
    build(l,m,rt<<1);
    build(m,r,rt<<1|1);
}

void PushUp(int rt,int l,int r)
{
    if(cover[rt]>0)
    {
        len[rt]=Y[r]-Y[l];
        lbt[rt]=rbt[rt]=1;
        sum[rt]=1;
    }
    else if(r-l==1)
    {
        len[rt]=0;
        lbt[rt]=rbt[rt]=0;
        sum[rt]=0;
    }
    else
    {
        len[rt]=len[rt<<1]+len[rt<<1|1];
        lbt[rt]=lbt[rt<<1];rbt[rt]=rbt[rt<<1|1];
        sum[rt]=sum[rt<<1]+sum[rt<<1|1]-rbt[rt<<1]*lbt[rt<<1|1];
    }
}

void update(int L,int R,int f,int l,int r,int rt)
{
    if(L<=Y[l]&&R>=Y[r])
    {
        cover[rt]+=f;
    }
    else
    {
        int m=(l+r+1)>>1;
        if(LY[m]) update(L,R,f,m,r,rt<<1|1);
    }
    PushUp(rt,l,r);
}

int main()
{
    //freopen("/home/zlwang/test.txt","r",stdin);
    int n;
    while(~scanf("%d",&n))
    {
        int x1,x2,y1,y2;
        int cnt=0;
        for(int i=0;i

你可能感兴趣的:(POJ-1177 Picture)