可以发现答案一定在所有向量终点形成的上凸壳上,于是在上凸壳上三分即可。

对于删除操作,相当于每个向量有一个作用区间,线段树分治即可。$O(n\log^2 n)$

同时可以发现,当询问按斜率排序后,每个凸壳上的决策点也是单调变化的,于是可以记录每次的决策位置。$O(n\log n)$

$O(n\log^2 n)$:

 #include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,op,x,y,tim,tot,d[N<<];
struct P{ ll x,y; };
struct D{ int l,r; P p; }p[N],q[N];
vector<P>v[N<<];
P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y}; }
ll operator *(P a,P b){ return a.x*b.y-a.y*b.x; }
bool cmp1(const D &a,const D &b){ return (a.p.x==b.p.x) ? a.p.y<b.p.y : a.p.x<b.p.x; }
bool cmp2(const D &a,const D &b){ return a.p*b.p<; }
ll calc(P a,P b){ return a.x*b.x+a.y*b.y; } void ins(int x,int L,int R,int l,int r,P p){
if (l<=L && R<=r){
while (v[x].size()> && (v[x][v[x].size()-]-v[x][v[x].size()-])*(p-v[x][v[x].size()-])>=) v[x].pop_back();
v[x].push_back(p); return;
}
int mid=(L+R)>>;
if (l<=mid) ins(lson,l,r,p);
if (r>mid) ins(rson,l,r,p);
} ll que(int x,int L,int R,int pos,P p){
ll ans=;
if (v[x].size()){
int l=,r=v[x].size()-;
while (l+<r){
int m1=l+(r-l)/,m2=r-(r-l)/;
if (calc(p,v[x][m1])>calc(p,v[x][m2])) r=m2; else l=m1;
}
rep(i,l,r) ans=max(ans,calc(p,v[x][i]));
}
if (L==R) return ans;
int mid=(L+R)>>;
if (pos<=mid) return max(ans,que(lson,pos,p)); else return max(ans,que(rson,pos,p));
} int main(){
freopen("bzoj4311.in","r",stdin);
freopen("bzoj4311.out","w",stdout);
scanf("%d",&n);
rep(i,,n){
scanf("%d",&op);
if (op==) scanf("%d%d",&x,&y),p[++tim]=(D){i,n,x,y};
if (op==) scanf("%d",&x),p[x].r=i;
if (op==) scanf("%d%d",&x,&y),q[++tot]=(D){i,tot,x,y};
}
sort(p+,p+tim+,cmp1);
rep(i,,tim) ins(,,n,p[i].l,p[i].r,p[i].p);
rep(i,,tot) printf("%lld\n",que(,,n,q[i].l,q[i].p));
return ;
}

$O(n\log n)$

 #include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
ll ans[N];
int n,op,x,y,tim,tot,d[N<<];
struct P{ ll x,y; };
struct D{ int l,r; P p; }p[N],q[N];
vector<P>v[N<<];
P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y}; }
ll operator *(P a,P b){ return a.x*b.y-a.y*b.x; }
bool cmp1(const D &a,const D &b){ return (a.p.x==b.p.x) ? a.p.y<b.p.y : a.p.x<b.p.x; }
bool cmp2(const D &a,const D &b){ return a.p*b.p<; }
ll calc(P a,P b){ return a.x*b.x+a.y*b.y; } void ins(int x,int L,int R,int l,int r,P p){
if (l<=L && R<=r){
while (v[x].size()> && (v[x][v[x].size()-]-v[x][v[x].size()-])*(p-v[x][v[x].size()-])>=) v[x].pop_back();
v[x].push_back(p); return;
}
int mid=(L+R)>>;
if (l<=mid) ins(lson,l,r,p);
if (r>mid) ins(rson,l,r,p);
} ll que(int x,int L,int R,int pos,P p){
ll ans=;
if (v[x].size()){
while (d[x]<(int)v[x].size()- && calc(p,v[x][d[x]+])>=calc(p,v[x][d[x]])) d[x]++;
ans=calc(p,v[x][d[x]]);
}
if (L==R) return ans;
int mid=(L+R)>>;
if (pos<=mid) return max(ans,que(lson,pos,p)); else return max(ans,que(rson,pos,p));
} int main(){
freopen("bzoj4311.in","r",stdin);
freopen("bzoj4311.out","w",stdout);
scanf("%d",&n);
rep(i,,n){
scanf("%d",&op);
if (op==) scanf("%d%d",&x,&y),p[++tim]=(D){i,n,x,y};
if (op==) scanf("%d",&x),p[x].r=i;
if (op==) scanf("%d%d",&x,&y),q[++tot]=(D){i,tot,x,y};
}
sort(p+,p+tim+,cmp1);
rep(i,,tim) ins(,,n,p[i].l,p[i].r,p[i].p);
sort(q+,q+tot+,cmp2);
rep(i,,tot) ans[q[i].r]=que(,,n,q[i].l,q[i].p);
rep(i,,tot) printf("%lld\n",ans[i]);
return ;
}

[BZOJ4311]向量(凸包+三分+线段树分治)的更多相关文章

  1. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

  2. BZOJ4311 向量(线段树分治+三分)

    由点积的几何意义(即投影)可以发现答案一定在凸壳上,并且投影的变化是一个单峰函数,可以三分.现在需要处理的只有删除操作,线段树分治即可. #include<iostream> #inclu ...

  3. 【BZOJ4311】向量(线段树分治,斜率优化)

    [BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...

  4. bzoj4311向量(线段树分治+斜率优化)

    第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2) ...

  5. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...

  6. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  7. BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)

    BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...

  8. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  9. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

随机推荐

  1. Axure RP 授权码

    Axure RP 8.1.0.3372Licensee:KoshyKey:wTADPqxn3KChzJxLmUr5jTTitCgsfRkftQQ1yIG9HmK83MYSm7GPxLREGn+Ii6x ...

  2. 一. Jmeter--使用代理录制脚本

    Jmeter脚本是以.JMX格式为主 1. Jmeter也是支持录制的,支持第三方录制方式和代理录制方式. (1).第三方录制主要是通过badboy来录制,录制后另存为jmx格式即可. (2).Jme ...

  3. ubuntu下中文输入法的配置,建议用fcitx

    Fcitx [ˈfaɪtɪks] 是一个支持扩展的输入法框架.它有自己维护的三个输入法,拼音,区位和码表:还支持其他引擎,rime 中州韵,google-pinyin,sunpinyin.Fcitx ...

  4. 137.Single Number II---位运算---《剑指offer》40

    题目链接:https://leetcode.com/problems/single-number-ii/description/ 题目大意:给出一串数,每个数都出现三次,只有一个数只出现一次,把这个出 ...

  5. Mac OS X 编译android内核 error: elf.h: No such file or directory 的解决方法

    1. 从网上下个elf.h放到scripts/mod/文件夹(http://www.rockbox.org/tracker/9006?getfile=16683) 2. 修改两个文件mk_elfcon ...

  6. linux/centos定时任务cron

    https://www.cnblogs.com/p0st/p/9482167.html cron: crond进程 crontab修改命令 * * * * *  command parameter & ...

  7. 构建基于TCP的应用层通信模型

    各层的关系如下图,表述的是两个应用或CS间通信的过程:   通常使用TCP构建应用时,需要考虑传输层的通信协议,以便应用层能够正确识别消息请求.比如,一个请求的内容很长(如传文件),那肯定要分多次发送 ...

  8. 以太坊go-ethereum客户端JSON-RPC API调用(一)

    前几篇博客主要介绍了go-ethereum客户端不同环境的搭建,今天这篇博客是建立在前几排博客的基础上.当搭建完成之后,我们可以通过各种方式与节点进行交互(JavaScript Console.JSO ...

  9. iOS开发:用DES对字符串加解密

    参考http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html,做了个小修改,实现PHP,JAVA,Objective-c加解密结果相同 ...

  10. 如何去除decimal后面的零?

    如何去除decimal后面的零? 1.260000m.ToString("G29") 不显示科学记数法? decimal.Parse("0.0000001",S ...