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

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

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

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

  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define ls (x<<1)
  6. #define rs (ls|1)
  7. #define lson ls,L,mid
  8. #define rson rs,mid+1,R
  9. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  10. typedef long long ll;
  11. using namespace std;
  12.  
  13. const int N=;
  14. int n,op,x,y,tim,tot,d[N<<];
  15. struct P{ ll x,y; };
  16. struct D{ int l,r; P p; }p[N],q[N];
  17. vector<P>v[N<<];
  18. P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y}; }
  19. ll operator *(P a,P b){ return a.x*b.y-a.y*b.x; }
  20. 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; }
  21. bool cmp2(const D &a,const D &b){ return a.p*b.p<; }
  22. ll calc(P a,P b){ return a.x*b.x+a.y*b.y; }
  23.  
  24. void ins(int x,int L,int R,int l,int r,P p){
  25. if (l<=L && R<=r){
  26. while (v[x].size()> && (v[x][v[x].size()-]-v[x][v[x].size()-])*(p-v[x][v[x].size()-])>=) v[x].pop_back();
  27. v[x].push_back(p); return;
  28. }
  29. int mid=(L+R)>>;
  30. if (l<=mid) ins(lson,l,r,p);
  31. if (r>mid) ins(rson,l,r,p);
  32. }
  33.  
  34. ll que(int x,int L,int R,int pos,P p){
  35. ll ans=;
  36. if (v[x].size()){
  37. int l=,r=v[x].size()-;
  38. while (l+<r){
  39. int m1=l+(r-l)/,m2=r-(r-l)/;
  40. if (calc(p,v[x][m1])>calc(p,v[x][m2])) r=m2; else l=m1;
  41. }
  42. rep(i,l,r) ans=max(ans,calc(p,v[x][i]));
  43. }
  44. if (L==R) return ans;
  45. int mid=(L+R)>>;
  46. if (pos<=mid) return max(ans,que(lson,pos,p)); else return max(ans,que(rson,pos,p));
  47. }
  48.  
  49. int main(){
  50. freopen("bzoj4311.in","r",stdin);
  51. freopen("bzoj4311.out","w",stdout);
  52. scanf("%d",&n);
  53. rep(i,,n){
  54. scanf("%d",&op);
  55. if (op==) scanf("%d%d",&x,&y),p[++tim]=(D){i,n,x,y};
  56. if (op==) scanf("%d",&x),p[x].r=i;
  57. if (op==) scanf("%d%d",&x,&y),q[++tot]=(D){i,tot,x,y};
  58. }
  59. sort(p+,p+tim+,cmp1);
  60. rep(i,,tim) ins(,,n,p[i].l,p[i].r,p[i].p);
  61. rep(i,,tot) printf("%lld\n",que(,,n,q[i].l,q[i].p));
  62. return ;
  63. }

$O(n\log n)$

  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define ls (x<<1)
  6. #define rs (ls|1)
  7. #define lson ls,L,mid
  8. #define rson rs,mid+1,R
  9. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  10. typedef long long ll;
  11. using namespace std;
  12.  
  13. const int N=;
  14. ll ans[N];
  15. int n,op,x,y,tim,tot,d[N<<];
  16. struct P{ ll x,y; };
  17. struct D{ int l,r; P p; }p[N],q[N];
  18. vector<P>v[N<<];
  19. P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y}; }
  20. ll operator *(P a,P b){ return a.x*b.y-a.y*b.x; }
  21. 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; }
  22. bool cmp2(const D &a,const D &b){ return a.p*b.p<; }
  23. ll calc(P a,P b){ return a.x*b.x+a.y*b.y; }
  24.  
  25. void ins(int x,int L,int R,int l,int r,P p){
  26. if (l<=L && R<=r){
  27. while (v[x].size()> && (v[x][v[x].size()-]-v[x][v[x].size()-])*(p-v[x][v[x].size()-])>=) v[x].pop_back();
  28. v[x].push_back(p); return;
  29. }
  30. int mid=(L+R)>>;
  31. if (l<=mid) ins(lson,l,r,p);
  32. if (r>mid) ins(rson,l,r,p);
  33. }
  34.  
  35. ll que(int x,int L,int R,int pos,P p){
  36. ll ans=;
  37. if (v[x].size()){
  38. while (d[x]<(int)v[x].size()- && calc(p,v[x][d[x]+])>=calc(p,v[x][d[x]])) d[x]++;
  39. ans=calc(p,v[x][d[x]]);
  40. }
  41. if (L==R) return ans;
  42. int mid=(L+R)>>;
  43. if (pos<=mid) return max(ans,que(lson,pos,p)); else return max(ans,que(rson,pos,p));
  44. }
  45.  
  46. int main(){
  47. freopen("bzoj4311.in","r",stdin);
  48. freopen("bzoj4311.out","w",stdout);
  49. scanf("%d",&n);
  50. rep(i,,n){
  51. scanf("%d",&op);
  52. if (op==) scanf("%d%d",&x,&y),p[++tim]=(D){i,n,x,y};
  53. if (op==) scanf("%d",&x),p[x].r=i;
  54. if (op==) scanf("%d%d",&x,&y),q[++tot]=(D){i,tot,x,y};
  55. }
  56. sort(p+,p+tim+,cmp1);
  57. rep(i,,tim) ins(,,n,p[i].l,p[i].r,p[i].p);
  58. sort(q+,q+tot+,cmp2);
  59. rep(i,,tot) ans[q[i].r]=que(,,n,q[i].l,q[i].p);
  60. rep(i,,tot) printf("%lld\n",ans[i]);
  61. return ;
  62. }

[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. 下拉刷新和UITableView的section headerView冲突的原因分析与解决方案

    UITableView:下拉刷新和上拉加载更多 [转载请注明出处] 本文将说明具有多个section的UITableView在使用下拉刷新机制时会遇到的问题及其解决方案. 工程地址在帖子最下方,只需要 ...

  2. Spring Boot中对log4j进行多环境不同日志级别的控制

    之前介绍了在<Spring boot中使用log4j记录日志>,仅通过log4j.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需 ...

  3. [NOIP2003]栈 题解(卡特兰数)

    [NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序 ...

  4. VS 2010 应用程序无法启动

    其实一般遇到这种问题, 不管是debug还是release, 也不用看提示的内存地址, 首先应该想到库是否包含正确. 一个可能的错误就是32位或64位不匹配的错误. 比如环境变量设的是64位的Open ...

  5. jQuery的validation插件(验证表单插件)

    更完整的参考:http://www.runoob.com/jquery/jquery-plugin-validate.html 验证隐藏字段的使用(验证通过后ajax提交表单):http://www. ...

  6. React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot

    〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...

  7. Springboot swagger2 导出api文档

    具体导出的代码,参考了:http://www.spring4all.com/article/699 导出前,首先需要配置好swagger2,参见 https://www.cnblogs.com/yan ...

  8. sklearn逻辑回归(Logistic Regression)类库总结

    class sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_inter ...

  9. ubuntu下安装tftp服务器(转)

    安装了好几次tftp服务器,每次在网上找安装方法,找到的都不一样,有的能用,有的不能用,先把一个能用的版本做一个备忘. 参考链接:http://www.cnblogs.com/geneil/archi ...

  10. nginx allow 多个ip & ipv4的网段表示方法解析

    参考:https://www.baidu.com/link?url=5aVe_syihQzhHnSDAdLsNNQYqDe_W2GYG1GeIQ130e4mEZbusxQfqGVTdg-dJg8fqM ...