BZOJ4311:向量——题解
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:向量——题解相关推荐
- 历届CSP真题题解-CSP刷真题之路
历届CSP真题题解-CSP刷真题之路(持续更新中...) 2020-12 2020-09 2020-06 2019-12 2020-12 题目编号 题解链接 CSP202012-1 期末预测之安全指数 ...
- POJ 1182 食物链(并查集+偏移向量)题解
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 82346 Accepted: 24616 Description ...
- Codeforces 935C Fifa and Fafa 题解 附平面几何基础:平面向量基本运算
一路过去好像平面向量也是必学的知识,毕竟用初中知识解题的日子已经过去了.我们来看一个例题. Codeforces 935C Fifa and Fafa 这个题是求一个圆之中不覆盖某点(x,y)的最大圆 ...
- SUST_ACM_2019届暑期ACM集训热身赛题解
问题A:Hello SUST! 知识点:基本输入输出 C/C++: 1 #include <stdio.h>2 3 int main() {4 int n;5 scanf("%d ...
- 【裴蜀定理】[HAOI2011]向量
BZOJ2299 [HAOI2011]向量 这个题写了一页式子qaq(还看了题解 刚开始在luogu AC了但在BZOJ CE了 看不懂不想看但感觉是abs的锅, 自己定义了一个abs就好了QAQ d ...
- 2018 ACM-ICPC Asia Shenyang Regional Contest 题解(9 / 13)【每日亿题2021/2/24】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2018 ACM-ICPC Shenyang J)How Much Memory Your ...
- 第十一届蓝桥杯校内赛题解
1 问题描述 两个二进制数11110011101和1111101001的和是多少?请用二进制表示,注意在提交的时候不要提交前导0. 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结 ...
- 线性代数:第五章 相似矩阵及二次型(1)向量的内积 方阵的特征值与特征向量 相似矩阵
第一节 向量的内积 一.数学概念 1. 内积:设有n维向量 令 , 则称[x,y]为向量x与y的内积. 2. 范数:称 为向量x的范数(或长度). 3. 单位向量:称 时的向量x ...
- POJ 3735 Training little cats 题解 《挑战程序设计竞赛》
为什么80%的码农都做不了架构师?>>> POJ 3735 Training little cats调教猫咪:有n只饥渴的猫咪,现有一组羞耻Play,由k个操作组成,全部选自: ...
- 剑指offer之26-30题解
剑指offer之26-30题解 目录 二叉搜索树与双向链表 字符串的排列 数组中出现次数超过一半的数字 最小的K个数 连续子数组的最大和 26. 二叉搜索树与双向链表 (一)题目描述 输入一棵二叉搜索 ...
最新文章
- 政府免费WiFi遭吐槽:近七成网友表示从未用过
- 编译安装nginx1.9.7+php7.0.0服务器环境
- 电脑安装python为什么显示的是程序丢失-python报错:无法启动此程序,因为计算机中丢失...
- java 获得天气预报信息
- 前端学习(1872)vue之电商管理系统电商系统之完善登录之后的操作
- TensorFlow12CIFAR-CNN实现
- 数列分块入门 3(LibreOj-6279)
- 最流行的轻量级php框架,推荐20个最近很流行的优秀PHP框架
- 徘徊于斗牛之间 —— 星象、星宿与星座(风水)
- Unity3D资源热更新(一)
- spring AOP的配置
- 阿里云服务器租用测试
- 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
- irving - 初学python
- 抖音上几百万粉丝的能有什么用?
- ZeroMemory、memset 和 “={0}” 三者区别
- JavaScript-设计模式(四) 原型模式
- 轮询,长连接,长轮询原理及实现方式,优缺点
- 常用的字符串函数strcpy(a,b) / strlen(a) / strcat(a,b)/ strcmp(a, b)/ strupr(a) /strlwr(a)
- 华为云CEO张平安:WeLink构建全场景开放的办公生态