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

对于删除操作,相当于每个向量有一个作用区间,线段树分治即可。$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. form表单设置input文本属性只读,不可更改

    记住一条好用的,设置readonly属性为true <input     readonly=''true"> 更多方法,转载: http://www.jb51.net/web/6 ...

  2. Price(洛谷P4109 [HEOI2015]定价)

    题目 思路: 按照我的思路这一题应该是这样子的 剔除+判断 剔除 因为后面的0要越多越好,所以我们判断0出现的情况,当2个数之间的差大与10时,证明2个之间会存在一个0,所以这一位我们可以把它去掉,相 ...

  3. php常用函数——数学函数

    php常用函数——数学函数

  4. 设计模式之Proxy

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利. 2.某个客户端不 ...

  5. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  6. powerpc平台移植zebra或quagga-0.99.23

    1,先configure  ./configure   --enable-vtysh --disable-bgpd --disable-ripd --disable-ripngd --disable- ...

  7. java线上应用故障排查之二:高内存占用【转】

    前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...

  8. java各种链路工具性能监控工具

    Zipkin , Instana 和 Jaeger cat链路追踪系统 用于监控spring 的运行情况,比如内存,线程,池等宏观数据 spring boot admin java反编译 jar xv ...

  9. POJ - Problem 1275 - Cashier Employment

    · 对于差分约束,题目要求求什么便设什么,令$Sum[i]$表示由$0 ~ i$的雇佣人数. · 要充分利用题目所给条件,令$Have[i]$表示i时刻申报的人数,$Need[i]$表示i时刻需要的人 ...

  10. Jmeter命令行选项

    示例:jmeter.bat -n -j %tmp%\%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%%time:~ ...