https://www.lydsy.com/JudgeOnline/problem.php?id=4311

你要维护一个向量集合,支持以下操作:
1.插入一个向量(x,y)
2.删除插入的第i个向量
3.查询当前集合与(x,y)点积的最大值是多少。如果当前是空集输出0

半个论文题吧……另外当空集的时候没有及时跳出结果WA了debug很难受。

参考:https://blog.csdn.net/outer_form/article/details/52277030

首先,每个向量都在第一象限,然后根据点积的基本定义,实际上就是给定向量与其他向量投影到给定向量的长度的乘积。

故在向量的无穷远处取一点,过这个点做垂线,然后将垂线往原点移,最先扫到的向量就是答案。

于是我们可以发现答案一定在点集的凸包上。

然而对于每个向量生效时间段不一样,所以我们把点排序后(这样建凸包的时候就不用再排序了)按时间建立线段树完后把点扔上去,然后对于每个区间的点集建立凸包跑一遍。

另外我们还可以发现把询问向量极角排序之后决策点单调(显然决策点是从凸包靠下的点慢慢变成靠上的点),于是跑一遍就可以了。

对于向量的极角排序正好用归并排序连同爬线段树一起做了,所以复杂度为O(nlogn)。

#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct point{ll x,y;point(){}point(ll a,ll b){x=a,y=b;}point operator-(const point &b)const{return point(x-b.x,y-b.y);}
}q[N],s[N];
struct data{point a;int l,r;
}p[N];
int n,pcnt,qcnt,tmp[N],t[N];
vector<point>tr[N*4];
ll ans[N];
inline ll multiX(point a,point b){return a.x*b.y-b.x*a.y;
}
inline ll multiP(point a,point b){return a.x*b.x+a.y*b.y;
}
inline bool cmp(data a,data b){point u=a.a,v=b.a;return u.x>v.x||(u.x==v.x&&u.y>v.y);
}
void insert(int a,int l,int r,int l1,int r1,point x){if(r<l1||r1<l)return;if(l1<=l&&r<=r1){tr[a].push_back(x);return;}int mid=(l+r)>>1;insert(a<<1,l,mid,l1,r1,x);insert(a<<1|1,mid+1,r,l1,r1,x);
}
void divide(int a,int l,int r){if(l==r){tmp[l]=l;for(int i=0;i<tr[a].size();i++)ans[l]=max(ans[l],multiP(q[l],tr[a][i]));return;}int mid=(l+r)>>1;divide(a<<1,l,mid);divide(a<<1|1,mid+1,r);for(int i=l,j=l,k=mid+1;i<=r;i++){if(j<=mid&&(k>r||multiX(q[tmp[j]],q[tmp[k]])>=0))t[i]=tmp[j++];else t[i]=tmp[k++];}for(int i=l;i<=r;i++)tmp[i]=t[i];int rr=0;for(int i=0;i<tr[a].size();i++){while(rr>1&&multiX(tr[a][i]-s[rr-1],s[rr]-s[rr-1])>=0)rr--;s[++rr]=tr[a][i];}if(rr){for(int i=l,j=1;i<=r;i++){while(j<rr&&multiP(q[tmp[i]],s[j+1])>multiP(q[tmp[i]],s[j]))j++;ans[tmp[i]]=max(ans[tmp[i]],multiP(q[tmp[i]],s[j]));}}
}
int main(){n=read();for(int i=1;i<=n;i++){int op=read();if(op==1){int x=read(),y=read();p[++pcnt].a=point(x,y);p[pcnt].l=qcnt+1;p[pcnt].r=-1;}if(op==2){int id=read();p[id].r=qcnt;}if(op==3){int x=read(),y=read();q[++qcnt]=point(x,y);}}sort(p+1,p+pcnt+1,cmp);for(int i=1;i<=pcnt;i++){if(p[i].r==-1)p[i].r=qcnt;if(p[i].l>p[i].r)continue;insert(1,1,qcnt,p[i].l,p[i].r,p[i].a);}divide(1,1,qcnt);for(int i=1;i<=qcnt;i++)printf("%lld\n",ans[i]);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9086969.html

BZOJ4311:向量——题解相关推荐

  1. 历届CSP真题题解-CSP刷真题之路

    历届CSP真题题解-CSP刷真题之路(持续更新中...) 2020-12 2020-09 2020-06 2019-12 2020-12 题目编号 题解链接 CSP202012-1 期末预测之安全指数 ...

  2. POJ 1182 食物链(并查集+偏移向量)题解

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 82346   Accepted: 24616 Description ...

  3. Codeforces 935C Fifa and Fafa 题解 附平面几何基础:平面向量基本运算

    一路过去好像平面向量也是必学的知识,毕竟用初中知识解题的日子已经过去了.我们来看一个例题. Codeforces 935C Fifa and Fafa 这个题是求一个圆之中不覆盖某点(x,y)的最大圆 ...

  4. SUST_ACM_2019届暑期ACM集训热身赛题解

    问题A:Hello SUST! 知识点:基本输入输出 C/C++: 1 #include <stdio.h>2 3 int main() {4 int n;5 scanf("%d ...

  5. 【裴蜀定理】[HAOI2011]向量

    BZOJ2299 [HAOI2011]向量 这个题写了一页式子qaq(还看了题解 刚开始在luogu AC了但在BZOJ CE了 看不懂不想看但感觉是abs的锅, 自己定义了一个abs就好了QAQ d ...

  6. 2018 ACM-ICPC Asia Shenyang Regional Contest 题解(9 / 13)【每日亿题2021/2/24】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2018 ACM-ICPC Shenyang J)How Much Memory Your ...

  7. 第十一届蓝桥杯校内赛题解

    1 问题描述 两个二进制数11110011101和1111101001的和是多少?请用二进制表示,注意在提交的时候不要提交前导0. 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结 ...

  8. 线性代数:第五章 相似矩阵及二次型(1)向量的内积 方阵的特征值与特征向量 相似矩阵

    第一节  向量的内积 一.数学概念 1. 内积:设有n维向量 令         , 则称[x,y]为向量x与y的内积. 2. 范数:称  为向量x的范数(或长度). 3. 单位向量:称  时的向量x ...

  9. POJ 3735 Training little cats​ 题解 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 3735 Training little cats调教猫咪:有n只饥渴的猫咪,现有一组羞耻Play,由k个操作组成,全部选自: ...

  10. 剑指offer之26-30题解

    剑指offer之26-30题解 目录 二叉搜索树与双向链表 字符串的排列 数组中出现次数超过一半的数字 最小的K个数 连续子数组的最大和 26. 二叉搜索树与双向链表 (一)题目描述 输入一棵二叉搜索 ...

最新文章

  1. 政府免费WiFi遭吐槽:近七成网友表示从未用过
  2. 编译安装nginx1.9.7+php7.0.0服务器环境
  3. 电脑安装python为什么显示的是程序丢失-python报错:无法启动此程序,因为计算机中丢失...
  4. java 获得天气预报信息
  5. 前端学习(1872)vue之电商管理系统电商系统之完善登录之后的操作
  6. TensorFlow12CIFAR-CNN实现
  7. 数列分块入门 3(LibreOj-6279)
  8. 最流行的轻量级php框架,推荐20个最近很流行的优秀PHP框架
  9. 徘徊于斗牛之间 —— 星象、星宿与星座(风水)
  10. Unity3D资源热更新(一)
  11. spring AOP的配置
  12. 阿里云服务器租用测试
  13. 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
  14. irving - 初学python
  15. 抖音上几百万粉丝的能有什么用?
  16. ZeroMemory、memset 和 “={0}” 三者区别
  17. JavaScript-设计模式(四) 原型模式
  18. 轮询,长连接,长轮询原理及实现方式,优缺点
  19. 常用的字符串函数strcpy(a,b) / strlen(a) / strcat(a,b)/ strcmp(a, b)/ strupr(a) /strlwr(a)
  20. 华为云CEO张平安:WeLink构建全场景开放的办公生态

热门文章

  1. PowerDesigner逆向工程,从SQL Server数据库生成Physical Model
  2. stl_algorithm算法之排序算法
  3. 【学习】js学习笔记---数组对象
  4. memcpy函数的使用方法
  5. 应用代理 socket TCP协议 的资料
  6. 关于Redis的常见面试题解析
  7. Go语言的一些使用心得
  8. GridBagLayout
  9. 【原创】大叔算法分享(6)机器学习概览
  10. LCS(HDU_5495 循环节)