首页 > 其他分享 >矩形面积并 - 扫描线模板

矩形面积并 - 扫描线模板

时间:2024-10-06 21:22:34浏览次数:1  
标签:cnt int ll xx 扫描线 x2 line 矩形 模板

扫描线模板(矩形面积并)

首先离散化的思想,将各个线段细分到单位长,于是就是动态求当前值域内 tag \(> 1\) 的数量。

以下是参考代码,十分优美

int n, cnt;
ll xx[N];
struct Scanline{
    ll y;
    ll lx, rx;
    int inout;
    bool operator < (const Scanline &t) const{
        return y < t.y;
    }
}line[N];
void lineadd(ll yt, ll lxt, ll rxt, int inoutt, int count){
    line[count].inout = inoutt;
    line[count].y = yt;
    line[count].lx = lxt;
    line[count].rx = rxt;
}
int ls(int p){return p << 1;}
int rs(int p){return p << 1|1;}
struct SegmentTree{
    ll tree[N << 2|1];
    int tag[N << 2 |1];
    inline void push_up(int p, int pl, int pr){
        // 向上传递节点,更新节点值
        if(tag[p]){
            tree[p] = xx[pr] - xx[pl];
        }else if(pl + 1 == pr){
            tree[p] = 0;
        }else{
            tree[p] = tree[ls(p)] + tree[rs(p)];
        }
    }

    inline void update(int L, int R, int p, int pl, int pr, int inoutt){
        if(L <= pl && pr <= R){
            tag[p] += inoutt;
            push_up(p, pl, pr);
            return ;
        }
        if(pl + 1 == pr) return ;
        int mid = (pl + pr) >> 1;
        if(L <= mid){
            update(L, R, ls(p), pl, mid, inoutt);
        }
        if(R >= mid + 1){
            update(L, R, rs(p), mid, pr, inoutt); // 注意不是 mid + 1,因为连续性
        }
        push_up(p, pl, pr);
    }

};
SegmentTree seg;

void solve() {
    cin >> n;
    ll x1, x2, y1, y2;
    for(int i = 1; i <= n; i++){
        cin >> x1 >> y1 >> x2 >> y2;
        lineadd(y1, x1, x2, 1, ++cnt);
        xx[cnt] = x1;
        lineadd(y2, x1, x2, -1, ++cnt);
        xx[cnt] = x2;
    }
    sort(xx + 1, xx + 1 + cnt);
    sort(line + 1, line + 1 + cnt);
    int xlen = unique(xx + 1, xx + 1 + cnt) - (xx + 1);
    ll ans = 0;
    for(int i = 1; i <= cnt; i++){
        ans += seg.tree[1]*(line[i].y - line[i - 1].y);
        int L = lower_bound(xx + 1, xx + 1 + xlen, line[i].lx) - xx;
        int R = lower_bound(xx + 1, xx + 1 + xlen, line[i].rx) - xx;
        seg.update(L, R, 1, 1, xlen, line[i].inout);
    }
    cout << ans << "\n";
}

标签:cnt,int,ll,xx,扫描线,x2,line,矩形,模板
From: https://www.cnblogs.com/9102qyy/p/18449433

相关文章

  • C++ 模板详解(一)
    C++模板模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;函数模板针对仅参数类型不同的函......
  • 修改帝国CMS模板出现Application Firewall Alert错误
    当在修改帝国CMS模板时出现“ApplicationFirewallAlert”错误,通常是因为服务器上的安全软件(如360主机安全卫士、McAfee、服务器安全狗等)误将您的IP地址识别为攻击者并加入了黑名单。以下是一些解决步骤:检查服务器安全软件:登录服务器控制面板或远程桌面。检查是否安装了360......
  • 帝国cms模板里显示发布信息人的ip地址
    要在EmpireCMS模板中显示发布信息人的IP地址,可以按照以下步骤进行操作:1.管理数据表登录EmpireCMS后台。进入数据表管理:依次点击:管理数据表 -> 管理字段。添加一个IP字段:点击 添加字段。输入字段名称 infoip。字段类型选择 VARCHAR。长度设置为 15。......
  • 帝国cms列表页模板动态获取文章内容点击数
    为了优化帝国CMS在列表页动态获取文章点击数目的性能,并且避免页面加载缓慢的问题,你可以按照以下步骤进行操作:修改HTML结构 在需要显示点击数的位置插入一个新的元素,并添加必要的数据属性。<emclass="clicknum"data-class="[!--classid--]"data-id="[!--id--]">[!--oncl......
  • 帝国CMS模板调用指定栏目的tag或当前栏目的tag
    在帝国CMS模板中,可以通过不同的SQL查询方式来调用指定栏目中的所有TAG。以下是四种不同的方法及其解释。方法1SQL查询sql selectDISTINCT([!db.pre!]enewstags.tagname),[!db.pre!]enewstags.tagid,[!db.pre!]enewstags.numfrom[!db.pre!]enewstagsinnerjoin[......
  • 帝国cms搜索页模板关键字结果标题加红的方法
    要在帝国CMS的搜索结果页面上实现关键词高亮显示的功能,可以按照以下步骤操作:备份原有模板文件:在修改任何模板文件之前,请确保备份原有的模板文件,以防修改出错时能够恢复。定位到模板编辑器:登录帝国CMS后台。导航至“模板”->“模板列表”。找到需要修改的搜索列表模板文......
  • 帝国cms会员空间模板显示最近来访访客信息
    为了实现用户登录状态下的信息记录以及未登录状态下的IP地区记录功能,你可以按照以下步骤操作:第一步:创建数据表在帝国CMS后台执行以下SQL语句创建数据表:CREATETABLE`{$dbtbpre}_userkjf`(`id`int(11)NOTNULLAUTO_INCREMENT,`lfuserid`varchar(20)CHARACTERSE......
  • 模板设计模式
    模板设计模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,而将一些步骤的实现延迟到子类中。结构抽象类(AbstractClass)定义了模板方法(TemplateMethod),它包含了算法的骨架,通常是一个final方法,以防止子类重写整个算法流程。同时定义了一些抽象方法(AbstractMethod),这......
  • pbootcms模板报错提示PHP Warning: Unknown: open_basedir restriction
    当PbootCMS模板出现报错提示 PHPWarning:Unknown:open_basedirrestrictionineffect.File 时,通常是因为PHP的 open_basedir 限制设置不当。以下是解决该问题的简要步骤:解决步骤检查PHP配置文件(php.ini):确认 open_basedir 设置是否正确。修改 open_b......
  • PbootCMS模板添加栏目提示:该内容栏目编号已经存在,不能再使用
    遇到在PbootCMS中添加栏目时提示“该内容栏目编号已经存在,不能再使用”的问题,通常是因为数据库中的栏目表(通常是ay_content_sort)中某个栏目的scode(栏目编号)与新添加的栏目编号冲突了。解决这个问题的方法如下:使用数据库管理工具:推荐使用如NavicatPremium这样的工具来管理MyS......