洛谷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

C#实现串口通讯程序

1、自动获取本地串口。2、根据传入串口基本属性参数打开串口。3、串口数据的发送接收功能(ASCII和HEX格式)。4、ASCII和HEX相互转换。csharp体验AI代码助手代码解读复制代码[Category("UserProperty")] [Description("轮廓半径")] public int Radius { get => radius;

2401_89221445的博客 1765

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

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

小衣同学的博客 835

vivado安装空间与依赖要求:入门须知要点

准备安装Vivado时,需重点关注系统空间和依赖环境的配置。结合vivado安装教程,详细说明最低磁盘要求、内存配置及操作系统兼容性,帮助新手快速搭建开发环境,避免常见安装失败问题。

weixin_34725745的博客 1573

2021电子科技大学分布式系统期末考点精析与实战解析

本文深入解析2021年电子科技大学分布式系统期末考试核心考点,包括分布式事务、时钟同步、GFS架构等高频内容。基于回忆版试题,提供实战解析与应试技巧,帮助考生高效复习。重点涵盖两阶段提交、Cristian算法等关键技术,适合计算机专业学生备考参考。

weixin_29251131的博客 540

李超树模板 / p4097

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

m0_54646258的博客 689

Fedproto:原型聚合的联邦学习框架

文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“

weixin_47754029的博客 2649

李超树(无脑秒斜率)

文章目录一.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

CarMaker快速入门

本合集是小明师兄推出的CarMaker汽车仿真,CarMaker无论是传统动力学、动力系统开发、底盘系统开发还是目前智能驾驶辅助系统及智能驾驶系统开发有着非常重要的作用,可以有效节省开发周期和开发成本,基于仿真快速实现算法开发和系统验证。...

小明师兄的博客 1万+

EEVDF调度算法核心实现解析(一)

本文深入解析Linux kernel 6.6引入的EEVDF调度算法核心实现,详细讲解其基于虚拟截止时间(virtual deadline)的进程挑选机制和红黑树优化设计。通过代码实例展示算法如何平衡系统响应速度与公平性,特别适合需要优化Linux系统性能的开发者参考。

weixin_42522953的博客 477

线段树之李超树

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

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 891

P3615 如厕计划

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

weixin_30307267的博客 240

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

qq_41997978的博客 630

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

dingxingdi的博客 967

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、付费专栏及课程。

余额充值