bzoj 3533 [Sdoi2014]向量集 凸包

【计算几何】 向量叉积&&Andrew算法求凸包 详解 文章目录一.预备知识 一.预备知识 1.向量 向量是一类既有大小又有方向的量,如加速度,速度,位移等等 向量的编程表示: typedef struct{ double x; double y; }Vector; 2.向量的叉积 叉积又称叉乘,符号为×。 两个向量叉乘的结果还是一个向量 其运算规则如下: ①所得向量的模为: ∣a×b∣=∣a∣⋅∣b∣⋅sinθ|a×b|=|a|\cdot|b|\cdot sinθ∣a×b∣=∣a∣⋅∣b∣⋅sinθ 其中θθθ为向量a与向量b的夹角 ②所得向量的方向 阅读详情

和2961求的是一个东西。
维护上下两个凸包,然后三分。
上次写得是一个正常的线段树,填满一个区间就合并。
这次写了一个奇怪的按二进制维护log棵类线段树状物的东西,然后发现跑得比线段树慢。。。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 810000
const ll inf=~0llu>>1;
int Q,l,r,top,cnt,n,num,xq,yq;
char opt[11],s[11];
ll ans;
int X[N],Y[N],p[N*20],ch[N][2];
int st[21],size[N],L[N],R[N],mx[N],mn[N];
int beg1[N],ed1[N],beg2[N],ed2[N];
ll getk(int p1,int p2,int p3)
{return (ll)(X[p2]-X[p1])*(Y[p3]-Y[p2])-(ll)(X[p3]-X[p2])*(Y[p2]-Y[p1]);}
void dec(int &x)
{
    if(opt[1]=='E')return;
    x=x^(ans& 0x7fffffff);
}
void ins1(int x,int v)
{
    while(num-beg1[x]>=1&&getk(p[num-1],p[num],v)>=0)
        num--;
    p[++num]=v;
}
void ins2(int x,int v)
{
    while(num-beg2[x]>=1&&getk(p[num-1],p[num],v)<=0)
        num--;
    p[++num]=v;
}
int merge(int x,int y)
{
    int ret=++cnt,l1,l2;
    ch[ret][0]=x;ch[ret][1]=y;
    L[ret]=L[x];R[ret]=R[y];
    mx[ret]=max(mx[x],mx[y]);
    mn[ret]=min(mn[x],mn[y]);
    size[ret]=size[x]+size[y];

    beg1[cnt]=num+1;
    l1=beg1[x],l2=beg1[y];
    while(l1<=ed1[x]&&l2<=ed1[y])
    {
        int t1=p[l1],t2=p[l2];
        if(X[t1]<X[t2]||(X[t1]==X[t2]&&Y[t1]<Y[t2]))
            ins1(cnt,t1),l1++;
        else ins1(cnt,t2),l2++;
    }
    while(l1<=ed1[x])
        ins1(cnt,p[l1]),l1++;
    while(l2<=ed1[y])
        ins1(cnt,p[l2]),l2++;
    ed1[cnt]=num;

    beg2[cnt]=num+1;
    l1=beg2[x],l2=beg2[y];
    while(l1<=ed2[x]&&l2<=ed2[y])
    {
        int t1=p[l1],t2=p[l2];
        if(X[t1]<X[t2]||(X[t1]==X[t2]&&Y[t1]>Y[t2]))
            ins2(cnt,t1),l1++;
        else ins2(cnt,t2),l2++;
    }
    while(l1<=ed2[x])
        ins2(cnt,p[l1]),l1++;
    while(l2<=ed2[y])
        ins2(cnt,p[l2]),l2++;
    ed2[cnt]=num;

    return ret;
}
void newnode(int x,int y)
{
    X[++n]=x;Y[n]=y;
    st[++top]=++cnt;size[cnt]=1;
    beg1[cnt]=ed1[cnt]=++num;p[num]=n;
    beg2[cnt]=ed2[cnt]=++num;p[num]=n;
    L[cnt]=R[cnt]=n;mx[cnt]=mn[cnt]=x;

    while(top>1&&size[st[top]]==size[st[top-1]])
        st[top-1]=merge(st[top-1],st[top]),top--;
}
ll getv(int x){return (ll)xq*X[x]+(ll)yq*Y[x];}
void proc(int x)
{
    if(yq==0)
    {
        ans=max(ans,(ll)xq*mx[x]);
        ans=max(ans,(ll)xq*mn[x]);
    }
    else
    {   
        int l,r;
        if(yq>0)l=beg1[x],r=ed1[x];
        else l=beg2[x],r=ed2[x];
        while(r-l>=5)
        {
            int lm=(l+l+r)/3,rm=(l+r+r)/3;
            if(getv(p[lm])<getv(p[rm]))l=lm;
            else r=rm;
        }
        for(int i=l;i<=r;i++)
            ans=max(ans,getv(p[i]));
    }
}
void query(int x)
{
    if(!x||r<L[x]||l>R[x])return;
    if(l<=L[x]&&R[x]<=r)
        {proc(x);return;}
    query(ch[x][0]);query(ch[x][1]);
}
int main()
{
    //freopen("tt.in","r",stdin);
    scanf("%d%s",&Q,opt+1);
    for(int x,y;Q--;)
    {
        scanf("%s",s+1);
        if(s[1]=='A')
        {
            scanf("%d%d",&x,&y);
            dec(x);dec(y);
            newnode(x,y);
        }
        else
        {
            scanf("%d%d%d%d",&x,&y,&l,&r);
            dec(x);dec(y);dec(l);dec(r);
            ans=-inf;xq=x;yq=y;
            for(int i=1,t;i<=top;i++)
                query(st[i]);
            printf("%lld\n",ans);
        }
    }
    return 0;
}
【从零开始玩量化7】easyTrader: 自动化(程序化)交易利器 前面的文章,我们介绍了数据获取工具AKShare, 量化回测工具backtrader等,这一篇,介绍程序化交易工具easyTrader。作者网名食灯鬼,目前项目在Github上的star数已经有6.7k。这可能是目前,开源能找到的,最好用的程序化交易库了。本文介绍了easyTrader的简单用法,这个包还有很多功能,后续再继续写文章探究。 阅读详情

相关推荐

国产化软件设计:遵循信创要求,助力信息技术自主创新

支持国产操作系统、CPU、数据库和中间件。确保网络通信的身份鉴别、数据传输机密性和完整性。实现应用和数据层的身份鉴别、数据传输机密性完整性、数据存储机密性完整性。依托法院密码服务平台提供的商用密码能力。

qq_41186565的博客 3372

凸包+凹包+凸边凹化算法

凸包算法+凹包算法+凸边凹化算法

轩逸云的博客 1万+

永磁同步电机ADRC控制策略优化:从理论到Simulink仿真实践

本文深入探讨了永磁同步电机自抗扰控制(ADRC)策略的优化与实践。针对传统PID在动态响应、抗扰及噪声抑制方面的不足,详细解析了ADRC三大核心组件——跟踪微分器(TD)、扩张状态观测器(ESO)与非线性状态误差反馈(NLSEF)的工作原理。通过手把手的Simulink仿真教程,展示了从算法编写、模型搭建到参数整定的完整流程,并进阶实现了位置-速度双环ADRC协同控制,为高性能电机伺服系统设计提供了从理论到实践的清晰指南。

root9的博客 412

数学:凸包算法详解

一.概念: 凸包(Convex Hull)是一个计算几何(图形学)中的概念。 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(X1,…Xn)的线性组合来构造. 在二维欧几里得空间中,凸包可想象为一条刚好包著所有点的橡皮圈。 用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。 例子:...

xiong_min的博客 2474

Crush 终端 LLM 工具安装与使用指南:把 AI 编程助手装进你的命令行

喜欢命令行的开发者需要离线/轻量级 AI 助手的场景希望自定义模型与工具链的高级用户通过LSP + MCP + 多模型支持,Crush 不仅能写代码,还能理解项目、调用工具、连接服务,真正成为你的“终端编程搭档”。

weixin_44058951的博客 1616

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9887

凸包算法(convex hull)

凸包算法 其实很简单,就是用一个的凸多边形围住所有的点。就好像桌面上有许多图钉,用一根紧绷的橡皮筋将它们全部围起来一样。算法详细步骤: 1. 找到所有点中纵坐标y最小的点,也就是这些点中最下面的点,记为p0。 2. 然后计算其余点与该点的连线与x轴之间夹角的余弦值,将这些点按其对于最低点的正弦值从大到小排序,排序好的点记为p1, p2, p3, ...... 3. 将最低点p0和排序好的点中的第一个点p1压入栈中,然后从p2开始计算,计算栈顶两个点与该点三点向量是否是逆时针转动,若是,则将该点压

mjiansun的专栏 9474

实战:RK3568 Android14 调试 ES8388 音频驱动 (MIC 篇)

这个板子的MIC设计使用了硬件自动切换方案,极大简化了软件层面的逻辑。我们不需要根据耳机插拔事件去编写复杂的路由切换代码,只需要守住 LIN1/RIN1 这一个入口,配置好增益,剩下的交给那颗 SGM3157 芯片即可。祝您的录音功能调试顺利!

qq_33427070的博客 1678

BZOJ 3533 Sdoi2014 向量集 线段树+凸包+三分

题目大意:给定一个平面,维护下列操作: 1.插入一个向量 2.询问第l到r个插入的向量中与某个向量叉积的最大值 强制在线 首先答案一定在凸包上 而且如果y>0则在上凸包上 否则就在下凸包上 且答案在同一凸包上呈现单峰函数 满足三分性质 但是现在让我们维护某个区间内的凸包,因此我们可以使用线段树 由于凸包的合并是线性的,我们不能每插入一个点都路径维护一下 这个很好办嘛!反正包含未插入

世界 2639

芯片设计|SoC芯片设计流程 与 软硬件协同设计

SoC通常被称作系统级芯片或者片上系统,作为一个完整的系统,**其包含了硬件和软件两部分内容**。这里所说的硬件指SoC芯片部分,**软件是指运行在SoC芯片上的系统及应用程序**。既然它是由软件和硬件组合而成,则在进行系统设计时,**就必须同时从软件和硬件的角度去考虑。**

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1824

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 141

bzoj3533: [Sdoi2014]向量集 线段树分治+凸包+三分

bzoj3533: [Sdoi2014]向量集 Description 维护一个向量集合,在线支持以下操作: “A x y (|x|,|y| &lt; =10^8)”:加入向量(x,y); ” Q x y l r (|x|,|y| &lt; =10^8,1 &lt; =L &lt; =R &lt; =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最...

maxtir的博客 320

DB文件在编程中的作用及示例代码

通过使用DB文件,我们可以实现数据的持久化存储,并能够高效地进行数据的增删改查操作。在本文中,我们以SQLite数据库为例,演示了如何使用Python语言创建和操作DB文件的示例代码。在实际的编程中,我们可以根据具体的需求和使用的数据库系统来进行更复杂的操作和优化。通过使用DB文件,我们可以实现数据的持久化存储,确保数据在程序关闭后也能被保留,并且能够高效地进行数据检索和更新。在本文中,我们将探讨DB文件的作用,并提供一些示例代码展示如何在编程中使用DB文件。上述代码中,我们使用SQLite提供的。

CodeSpark的博客 1821

【bzoj3533】[Sdoi2014]向量集 三分+线段树+凸包

考虑一个查询操作 xz+yw=ans w+x/y*z=ans/y w=-x/y*z+ans/y ans/y表示过点(z,w)的斜率为-x/y的直线在y轴上的截距 当y>0时,截距越大,ans越大,在上凸壳上找答案 当y 答案可以三分,也可以直接set维护斜率找斜率最接近的那个点 问题来了,如何维护区间[L,R]的凸包 线段树的每个节点建凸包是O(size log n)的

Oxer的专栏 976

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【BZOJ】【P3533】【Sdoi2014】【向量集】【题解】【线段树+凸包+三分】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3533 显然答案一定在凸包上

退役狗的专栏 1957

IMSL CNL 7.0.0 (x86-64)Crack

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

BZOJ 3533 [SDOI2014]向量集 (线段树维护凸包)

题面:BZOJ传送门 洛谷传送门 容易想到这样一个结论 把每次插入向量$(z,w)$改为在坐标系内插入一个点$(z,w)$,并对这些点建出凸包。 每次询问向量$(x,y)$的答案,设一条直线$l$垂直于$(x,y)$,用l去切所有已知向量构成的凸包,第一个切到的点就是最优解,根据$y$的正负来决定是从上面切还是下面切 简单证明一下,向量点积相当于向量$(z,w)$在$(x,y)$上的投影*...

weixin_30413739的博客 206

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[SDOI2014][BZOJ3533] 向量集 [线段树+凸包]

题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_0x_1+y_0y_1\geq x_0x_2+y_0y_2$ 然后其实会发现这条路走不通 那么还有什么办法呢?我们发现上面的式子里面是有$Ans$存在的 那我们尝试把$Ans$搞进去 $y_...

154

BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)

Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值。 集合初始时为空。 ...

weixin_34293911的博客 129

bzoj3533【SDOI2014】向量集 (线段树 凸包 三分)

有一个结论:答案一定会出现在凸包上,而且如果y>0则在上凸包上,否则在下凸包上。 简单证明:要计算一个向量a和一些向量的点积的最大值。因为所有向量都是共起点的,所以只要找到这些向量终点中在向量a的方向最靠前的,而这个最靠前点一定在凸包上。 然后在一个凸包上答案是单峰的,可以用三分来做。 于是问题就变成了如何动态维护区间的凸包,这个可以用线段树。 可是问题在于每次新加一个点会修改logn段区间,而凸包合并是O(n),显然这个复杂度不能接受。 有一个比较巧妙的解决方法,包含未插入位置的线段树节点一定不会.

0ng的博客 297

BZOJ 3533 [Sdoi2014]向量集(线段树套凸包)(含对拍)

题目大意 强制在线 操作1:在一个序列后加入一个向量 操作2:给定一个向量a,查找一个区间里面区间与向量a点乘的最大值。 范围是4e5 分析 分析之前必须说两句,妈的学个计算几何打算找个板子弄了个这么恼火的东西,感觉再也忘不了凸包了。。。里面还有三分这种并没有学过的东西(好在不是很难)。 然后码了一下午,在BZOJ上面RE了一晚上,关键是这里的RE是由于强制在线出现错误答案造成的...

少主大人殿下的博客 297

bzoj 3533: [Sdoi2014]向量集 线段树+凸包+二分

题意维护一个向量集合,在线支持以下操作: “A x y (|x|,|y| < =10^8)”:加入向量(x,y); ” Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值。 集合初始时为空。强制在线。 1 < =N < =4×10^5分析世界上最开心的事情莫过于一遍AC

beginend 400

bzoj3533 [Sdoi2014]向量集 可持久化凸包+二分

首先,x和y都小于一个向量且都大于一个向量的点一定是没有用的 这样就相当于挖掉了决策中位置偏中间的点,然后要求ax+by的最小值 设 ax+by=k,则 y=k/b-a/bx  ,就变成了类似斜率优化的东西,相当于拿一个斜率去卡一个点 卡的点一定在凸包上,所以维护凸包,然后二分斜率查询就可以了 这个题要求支持查询历史版本的凸包,可以用线段树的思想,树分治的复杂度分析方法,将最终凸包2分成若

-----PSI----- 603

Bzoj3533:[Sdoi2014]向量集:线段树+凸包+三分

题目链接[Sdoi2014]向量集 维护一颗线段树,线段树每个节点上有对应区间的上下凸壳 可以发现答案一定在凸壳上取得,所以在凸壳上三分即可,y>=0时在上凸壳上三分,否则在下凸壳 #include #include #include #include #include #define ll long long #define pb push_back #define pii pair #d

蜜の夜明け 635

[Sdoi 2014] bzoj3533 向量集 [线段树+凸包+三分]

Decription: 维护一个向量集合,在线支持以下操作: "A"A"A xxx yyy (|x|,|y|&lt;=108)"(|x|,|y|&lt;=108)"(|x|,|y| < =10^8)":加入向量(x,y)(x,y)(x,y); "Q"Q" Q xxx yyy lll rrr (|x|,|y|&lt;=108,1&lt;=L&lt;=R&lt;=

pocket_legend 227

[BZOJ3533][Sdoi2014]向量集(凸包+线段树+二分)

Address 洛谷P3309 BZOJ3533 LOJ#2197 Solution 先假设询问对象是所有的向量,并且已经全部加入集合。 发现向量 (x,y)(x,y)(x,y) 和向量 (a,b)(a,b)(a,b) 的点积,就等于过点 (x,y)(x,y)(x,y) 的、斜率为 −ab-\frac ab−ba​ 的直线在 yyy 轴上截距的 bbb 倍。 当 b&amp;gt;0b&amp;g...

女装的你,如此好看! 250

【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包

题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)":询问第L个到第R个加入的向量与向量(x,y)的点积的最大值。集合初始时为空。 输入 输入的第一行包含整数N和字符s...

weixin_30739595的博客 160
上一篇: bzoj 2961 共点圆 CDQ分治 凸包
下一篇: uoj #86 mx的组合数 FFT 原根
make_it_for_good
博客等级 码龄11年 13粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值