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

对于删除操作,相当于每个向量有一个作用区间,线段树分治即可。$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. Java 中的几种线程池这么用才是对的

    为什么要使用线程池 虽然大家应该都已经很清楚了,但还是说一下.其实归根结底最主要的一个原因就是为了提高性能. 线程池和数据库连接池是同样的道理,数据库连接池是为了减少连接建立和释放带来的性能开销.而线 ...

  2. 【leetcode 简单】第三十七题 相交链表

    编写一个程序,找到两个单链表相交的起始节点. 例如,下面的两个链表: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交. 注意: 如果两个 ...

  3. document.write 简介

    document.write 的执行分两种情况: 第一种:dom加载已完成 1. 执行 document.open() (即会清空document) 2. 执行 document.write() 3. ...

  4. http 之cookie和session

     cookie和session 关于http: 1.http是:无状态.短连接 2.http的请求生命周期:给服务端发送一个请起头,通过域名提取url,通过路由关系匹配,再通过函数+html进行模板加 ...

  5. python之smtplib库学习

    # -*- coding:utf-8 -*- import smtplibfrom email.mime.text import MIMETextfrom email import encodersf ...

  6. Guava cache功能简介(转)

    原文链接:http://ifeve.com/google-guava-cachesexplained/ 范例 LoadingCache<Key, Graph> graphs = Cache ...

  7. awk中NF,NR的含义

    awk中NF和NR的意义,其实你已经知道NF和NR的意义了,NF代表的是一个文本文件中一行(一条记录)中的字段个数,NR代表的是这个文本文件的行数(记录数).在编程时特别是在数据处理时经常用到.建议你 ...

  8. 解决uc浏览器不支持vw单位的方法

    插入下段代码,使用rem来代替vw <script type="text/javascript"> (function (doc, win) { var docEl = ...

  9. 深度学习方法(十一):卷积神经网络结构变化——Google Inception V1-V4,Xception(depthwise convolution)

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.机器学习技术感兴趣的同学加入. 上一篇讲了深度学习方法(十) ...

  10. hdu 5912(迭代+gcd)

    Fraction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...