洛谷P4097 bzoj3615 [HEOI2013]Segment(李超树)

李超线段树 李超线段树是巨佬李超发明的一种,又名李超树。代码简短,思想简明,用途广泛。 阅读详情

题意:

        两种操作,插入一个线段或询问x=x0x=x0时最大y对应的线段编号,同样大输出最小

思路:

       刚刚学了李超树就来A一下板子题,比起之前的1568多了很多细节。
       首先,我们需要确定线段的更新区间,我们更新只能在这个区间更新,其次,为了编号以及精度更高,我是用的是很多个区间去存的线段信息。其他方面跟1568大同小异,但是要注意斜率不存在的线段以及同等价值优先编号最小

错误及反思:

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 50100;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const double eps=1e-6;
int segx1[N<<2],segy1[N<<2],segid[N<<2],segx2[N<<2],segy2[N<<2];

int ans=0,lastans=0,tid=0;
bool did[N<<2];
double tval;

double Getval(int tx,int xx0,int yy0,int xx1,int yy1)
{
    if(xx0==xx1) return yy1;
    return 1.0*(tx-xx1)*(yy0-yy1)/(xx0-xx1)+yy1;
}

void change(int x,int v,int id,int l,int r,int rt){
    if(l==r){
        if(!did[rt]){
            segx1[rt]=segx2[rt]=l;
            segy1[rt]=segy2[rt]=v;
            segid[rt]=id;
            did[rt]=true;
        }
        else{
            double tx=Getval(x,segx1[rt],segy1[rt],segx2[rt],segy2[rt]);
            if(tx>v||tx==v&&id<segid[rt]){
                segx1[rt]=segx2[rt]=l;
                segy1[rt]=segy2[rt]=v;
                segid[rt]=id;
            }
        }
        return ;
    }
    int m=l+r>>1;
    if(m>=x) change(x,v,id,lson);
    else change(x,v,id,rson);
}


double Inter(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
    double a=x2-x1;
    double b=x3-x4;
    double c=y2-y1;
    double d=y3-y4;
    double g=x3-x1;
    double h=y3-y1;
    double f=a*d-b*c;
    double t=(d*g-b*h)/f;
    double s=(-c*g+a*h)/f;
    return x1+t*(x2-x1);
}

void update(int L,int R,int xx0,int yy0,int xx1,int yy1,int id,int l,int r,int rt){
    if(L<=l&&R>=r){
        if(!did[rt])segx1[rt]=xx0,segy1[rt]=yy0,segx2[rt]=xx1,segy2[rt]=yy1,segid[rt]=id,did[rt]=true;
        else{
            double f1=Getval(l,xx0,yy0,xx1,yy1);
            double f2=Getval(l,segx1[rt],segy1[rt],segx2[rt],segy2[rt]);
            double f3=Getval(r,xx0,yy0,xx1,yy1);
            double f4=Getval(r,segx1[rt],segy1[rt],segx2[rt],segy2[rt]);
            if(f1<=f2&&f3<=f4) return ;
            else if(f1>=f2&&f3>=f4)
                segx1[rt]=xx0,segy1[rt]=yy0,segx2[rt]=xx1,segy2[rt]=yy1,segid[rt]=id;
            else{
                int m=l+r>>1;
                double len=Inter(xx0,yy0,xx1,yy1,segx1[rt],segy1[rt],segx2[rt],segy2[rt]);
                if(f1>=f2){
                    if(len<=m) update(L,R,xx0,yy0,xx1,yy1,id,lson);
                    else{
                        update(L,R,segx1[rt],segy1[rt],segx2[rt],segy2[rt],segid[rt],rson);
                        segx1[rt]=xx0; segy1[rt]=yy0; segx2[rt]=xx1; segy2[rt]=yy1; segid[rt]=id;
                    }
                }
                else{
                    if(len>m)update(L,R,xx0,yy0,xx1,yy1,id,rson);
                    else{

                        update(L,R,segx1[rt],segy1[rt],segx2[rt],segy2[rt],segid[rt],lson);
                        segx1[rt]=xx0; segy1[rt]=yy0; segx2[rt]=xx1; segy2[rt]=yy1; segid[rt]=id;
                    }
                }
            }
        }
        return ;
    }
    int m=l+r>>1;
    if(L<=m) update(L,R,xx0,yy0,xx1,yy1,id,lson);
    if(R>m) update(L,R,xx0,yy0,xx1,yy1,id,rson);
}

void query(int x,int l,int r,int rt){
    if(did[rt]){
        double tx=Getval(x,segx1[rt],segy1[rt],segx2[rt],segy2[rt]);
        if(tx>tval||tx==tval&&segid[rt]<ans){
            tval=tx;
            ans=segid[rt];
        }
    }
    if(l==r) return ;
    int m=l+r>>1;
    if(m>=x) query(x,lson);
    else query(x,rson);
}

int main(){
    int m; scanf("%d",&m);
    while(m--){
        int t; scanf("%d",&t);
        if(t){
            int xx0,yy0,xx1,yy1;
            scanf("%d%d%d%d",&xx0,&yy0,&xx1,&yy1);
            xx0=(xx0+lastans-1)%39989+1;
            yy0=(yy0+lastans-1)%1000000000+1;
            xx1=(xx1+lastans-1)%39989+1;
            yy1=(yy1+lastans-1)%1000000000+1;
            if(xx0>xx1) swap(xx0,xx1),swap(yy0,yy1);
            if(xx0==xx1) change(xx0,max(yy0,yy1),++tid,1,50000,1);
            else update(xx0,xx1,xx0,yy0,xx1,yy1,++tid,1,50000,1);
        }
        else{
            int x;scanf("%d",&x);
            x=(x+lastans-1)%39989+1;
            ans=0; tval=0;
            query(x,1,50000,1);
            printf("%d\n",ans);
            lastans=ans;
        }
    }
}
【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行) 这数据结构的代码麻烦其它数据结构学学,点名LCT 阅读详情

相关推荐

牛客多校训练(第一场)H-Longest Path(点分治+李超树)

题意: &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 一颗有边权的树,对于一条路径(u,v),假设经过的边权为e1,e2,e3,...efe1,e2,e3,...efe_1,e_2,e_3,...e_f,则该路径权值cal(u,v)为(e2−e1)2+(e3−e2)2+...+(ef−ef−1)2(e2−e1)2+(e3−e2)2+...+(ef−ef−1)2(e_...

Roll_Keyboard的博客 747

数据结构-李超树学习小结

数据结构-李超树学习小结前言:正文: 前言: 李超树是由杭州学军中学的国家集训队大佬李超发明的,又称超哥线段树,主要功能是用线段树来维护某一点上对应的最高(最低)的线段(或直线)。在数学上来表述,就是处理在某一区间上许多条一次函数的图像y=ki∗x+by=k_i*x+by=ki​∗x+b,维护某一个xxx的值对应的不同的yyy的最大值(最小值)。 正文: 其实李超树并不复杂,主要依赖于线段树,线段...

ha_ing的博客 3849

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

动态开点李超树(例题+板子总结)

动态开点李超树(例题+板子总结)

小衣同学的博客 835

BEV感知技术全景解析:从纯视觉到多传感器融合的实战指南

本文全面解析了自动驾驶中的BEV感知技术,从纯视觉到多传感器融合的实战应用。文章深入探讨了BEV如何提供“上帝视角”,对比了IPM、Lift-Splat-Shoot及Transformer等核心实现范式,并详细阐述了多传感器融合(尤其是中融合)的工程实践与优势,为开发者提供了从理论到原型搭建的完整指南。

win55的博客 1139

Palantir 产品架构深度解析:从本体到AI的决策智能平台

本文深度解析了Palantir决策智能平台的核心产品架构。其核心在于构建企业级的“本体”(Ontology),即业务世界的“数字孪生”,通过数据、逻辑、操作三层抽象统一语义。平台以此为基础,通过Foundry构建数字孪生,并通过AIP(人工智能平台)实现本体增强生成(OAG),将AI深度融入业务,形成从数据感知、智能分析到行动执行的完整决策闭环。

ooo22的博客 735

李超树模板 / p4097

李超树是一种维护平面线段的数据结构,可以将一次函数存储至线段树中

m0_54646258的博客 689

EDF Browser使用说明和技巧

edf browser使用说明和一些小技巧

Erhu_666的博客 8321

李超树(无脑秒斜率)

文章目录一.What?二.How?1.插入(update)2.查询(query)三.板题( [\[JSOI2008\]Blue Mary开公司](https://www.luogu.com.cn/problem/P4254))五.高端操作1.动态开点2.合并(merge)四.ZZH的旅行Thanks! 一.What? 李超树个人认为用处有点大,因为会了李超树,就再也不怕斜率优化做不出来了,你但凡能够推出一个一次函数的式子那铁定用李超树。所以撒子是李超树呀?就是变异的线段树,即在某个区间内维护区间中点值最大的

weixin_43908980的博客 1431

手把手教你用Python 3.11和Node.js 18在Windows 11上搭建Dify开发环境

本文提供了一份详尽的Windows 11本地Dify开发环境搭建指南。文章手把手教你完成从Python 3.11、Node.js 18的安装配置,到PostgreSQL、Redis数据库服务的部署,再到前后端服务的启动与联调的全过程,并包含常见问题排查与效能优化建议,旨在帮助开发者构建一个稳定、可调试的Dify本地开发环境。

fire9的博客 645

Oracle ERP EBS R12 GL总帐业务方案 系统操作

本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。

anpeng2019的博客 1888

线段树之李超树

Brief 李超树是一种线段树的应用,主要应用场合为:单点集合域,区间等差插入,求单点最值。 For Example - 动态地插入多条二维线段,询问某个xxx对应的yyy值的最值。 - 修改[L,R,b,k][L,R,b,k][L,R,b,k],对于第i∈[L,R]i\in[L,R]i∈[L,R]个集合,插入b+(i−L)kb+(i-L)kb+(i−L)k,询问某个集合的最大值。 Proce...

QAQ 780

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(一)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 2418

P3615 如厕计划

$ \color{#0066ff}{ 题目描述 }$ 竞赛比完之后,水箱里充满水的选手们鱼贯而出。凡华中学的厕所规划的很糟,只有两个厕位,于是厕所门前排起了长长的队伍。 厕所有两个,一个是女生专用厕所,另一个是男女混用厕所。一共有2N个选手正在排队,男女生数量可能不同。如果队头的是妹子,只要某个厕所是空的就可以进入,但是如果两个厕所都是空的,那么优先进入女性专用厕所。而如果队头是个绅♂士,只有在男...

weixin_30307267的博客 240

学习STM32的DS18B20温度传感器

该函数首先复位传感器,然后发送跳过ROM命令和转换命令,并等待转换完成。接下来,它再次复位传感器,发送跳过ROM命令和读取温度命令。最后,它读取温度值的最低字节和最高字节,并将其组合成16位温度值。传感器的VCC引脚连接到STM32的3.3V电源,GND引脚连接到GND,而数据引脚连接到任何一个IO引脚。需要注意的是,示例代码中使用了一个简单的延时函数来等待转换完成。实际上,您可能需要使用定时器或其他更精确的延时方法来实现更准确的延时。下面是一个示例代码,演示如何读取DS18B20传感器的温度值。

m0_75244442的博客 1182

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

bzoj 4515. [Sdoi2016]游戏(树链剖分 + 李超线段树(真·模板) + 李超树维护区间最小值)

洛谷链接 树剖一下,直观上来看,是要在树上对一条链维护一段等差数列。如果维护的是区间和,每次在一段区间加上一段等差数列,这个可以直接在线段树上做不依赖任何科技,但这题的查询形式是最小值,直接做很难打标记进行维护。 将等差数列视作一次函数,考虑用李超树在链上维护一个一次函数。 预处理出每个点的深度值 dep[u] 在路径 s,ts,ts,t 上加入一条 斜率为 a,截距为 b 的直线,在 s,l...

qq_41997978的博客 630

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【模板】李超线段树 / [HEOI2013] Segment

李超线段树是一种用于维护平面直角坐标系内线段关系的数据结构,插入直线/线段,支持查询单点极值 李超树的经典应用是斜率优化,可以看下这篇文章 李超线段树没有用懒标记实现区间修改,而用的是标记永久化 其实标记永久化与我们对lazy标记的理解非常相同,可以看看LYD蓝书上对标记永久化的解释,都是累积某个节点到根节点路径上的所有点的影响 具体来说,我们用\(s[p]\)表示线段树上\(p\)节点存储线段...

dingxingdi的博客 967

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Composer包超时控制终极指南:请求超时和连接管理详解

Composer作为PHP生态中不可或缺的依赖管理工具,在处理包下载和安装过程中经常会遇到网络连接超时的问题。本文将深入探讨Composer的超时控制机制,帮助开发者解决常见的网络连接问题,提高包管理效率。✨ ## 为什么需要超时控制? 在网络环境不稳定或服务器响应缓慢的情况下,Composer可能会因为默认的超时设置而失败。了解超时控制机制可以帮助您: - 避免因网络问题导致安装中断 -

gitblog_00920的博客 434

李超树 bzoj1568

这个讲的不错:算法|李超线段树初步(算法讲解+例题) 用处:用于处理二维平面内的最优势线段(或直线),一般支持两种操作,向二维平面插入一条新的线段(或直线),询问x=a与所有的线段(或直线)的交点的最大(最小值)。 假设我们插入的是一条直线,他的方程为:y=ax+by=ax+by=ax+b。 线段树的区间下标代表x坐标。 那么插入的情况大体有四种: 这里就最大值来讨论。 若当前区间内还没有最优势...

cy41的博客 320

【BZOJ4311】向量(线段树分治,李超树)

明天参拜缙云神社

DD(XYX)的硫氰化氘博客 496

BZOJ.3938.Robot(李超线段树)

BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线。 用李超线段树维护最大最小值。对于折线分成若干条线段依次插入即可。 最好还是离线对时间离散化。 麻烦在写出来。。 复杂度\(O(c\log^2m+q\log m)\)? 以后李超树改用struct写了...学了一种写法好方便... //66516kb 5156m...

weixin_30414635的博客 193

李超树——倾斜的线段树

介绍 李超树用以解决一种问题:向平面上插入若干条直线(或线段),查询与直线x=a相交线段的交点坐标y的最大值, 别看这种问题好像挺个别,很多平面题或DP(斜率优化)的题都可以转换成这种问题,而遇到这种问题,李超树比平衡树好打得多。 思想 李超树代码看上去和普通线段树非常像,不同的是,每个节点维护的不是的区间,而是两端x坐标为 l、r 的一条带斜率的线段: (注意,每层的线段高低关系不确定,这样画只是为了好看) 这样查询只需像线段树那样查就是了, 然后怎么插入线段呢?(直线就是 -inf 到 i

偶耶的博客 478

牛客挑战赛54F题解 & 李超树学习笔记

场上瞎写暴力乱搞结果拿了一血(汗颜...不过还是得出题人谢罪) 考虑按点权从小到大依次插入每个点构建新树,发现每个点u能向任意一个a[v] < a[u]的v点连边,产生贡献为a[v] * dis(u, v) 然后我直接暴力按点权由小到大从每个点更新其他点,减了点枝就过了...(想了一下应该随便构造条链卡下就能卡掉) 正解: 点分+李超树 ...

caoyang1123的博客 449

李超树 学习笔记

最近做多校联赛的时候,遇到了一道不会做的题,题解上写需要用到李超树,所以就去学习了一下。参考博客:http://blog.youkuaiyun.com/clover_hxy/article/details/52503987李超树的经典题目是bzoj的1568。 在一个平面里面,有两种操作: 1.每次在一个平面插入一个条直线(给出两个端点(x0,y0)和(x1,y1)) 2.询问与x=k的相交的直线中,最上

john123741的博客 3407
上一篇: 李超树学习笔记
下一篇: 牛客多校训练(第一场)H-Longest Path(点分治+李超树)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值