YBTOJ:向量问题(线段树分治、凸包)
文章目录
- 题目描述
- 数据范围
- 解析
- 代码
题目描述
你要维护一个向量集合,支持以下操作:
插入一个向量 。
删除插入的第 x 个向量。
查询当前集合与(x,y)(x,y)(x,y) 点积的最大值是多少。如果当前是空集输出0。
数据范围
n<=2e5,x、y∈[1,2e6]n<=2e5,x、y∈[1,2e6]n<=2e5,x、y∈[1,2e6]
解析
考虑作当前向量的垂线,该线自上而下平移截得的第一个向量对应的点就是答案
如果本题没有删除操作,可以利用一个凸包来维护
但是如何支持删除呢?
考虑离线,对询问时间维护一个线段树
那么每个向量都有一个对应的有效区间
把该向量按照区间修改的方式加到线段树上,对每个线段树节点维护一个凸包
询问是从叶节点一直往上走,对每一个节点的凸包二分找到切点一直更新答案
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
const int M=2e6+100;
#define ll long long
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}
int n,m;
struct node{ll x,y;int id;bool operator < (const node o){if(x!=o.x) return x<o.x;return y<o.y;}
}p[N],ask[N];
int num,ans[N],cnt;
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
#define ed (tr[k].size()-1)
vector<int>tr[N<<2];
void add(int k,int x){while(tr[k].size()>1&&(p[tr[k][ed]].y-p[tr[k][ed-1]].y)*(p[x].x-p[tr[k][ed]].x)<=(p[x].y-p[tr[k][ed]].y)*(p[tr[k][ed]].x-p[tr[k][ed-1]].x)) tr[k].pop_back();tr[k].push_back(x);
}
void insert(int k,int l,int r,int x,int y,int o){//printf("insert:l=%d r=%d x=%d y=%d o=%d mid=%d %d %d\n",l,r,x,y,o,mid,x<=mid,y>mid);if(x<=l&&r<=y){//printf(" add:l=%d r=%d o=%d\n",l,r,o);add(k,o);return;}if(x<=mid) insert(ls,l,mid,x,y,o);if(y>mid) insert(rs,mid+1,r,x,y,o);
}
int find(int k,ll x,ll y){//printf(" k=%d find: siz=%d\n",k,tr[k].size());//for(int i=0;i<tr[k].size();i++) printf(" (%lld %lld)",p[tr[k][i]].x,p[tr[k][i]].y);//printf("\n");if(!tr[k].size()) return -1;else if(tr[k].size()==1||(p[tr[k][ed]].y-p[tr[k][ed-1]].y)*y>=-x*(p[tr[k][ed]].x-p[tr[k][ed-1]].x)) return tr[k][ed];int l=0,r=ed;while(l<r){int o=(l+r)>>1;if(o==ed||(p[tr[k][o+1]].y-p[tr[k][o]].y)*y<=-x*(p[tr[k][o+1]].x-p[tr[k][o]].x)) r=o;else l=o+1;//printf(" o=%d l=%d r=%d\n",o,l,r);}return tr[k][l];
}
ll query(int k,int l,int r,int o,ll x,ll y){//printf("k=%d l=%d r=%d x=%lld y=%lld\n",k,l,r,x,y);int pl=find(k,x,y);ll res=pl==-1?0:x*p[pl].x+y*p[pl].y;if(l==r) return res;if(o<=mid) res=max(res,query(ls,l,mid,o,x,y));else res=max(res,query(rs,mid+1,r,o,x,y));return res;
}
int st[N],eed[N];
int main(){n=read();
// for(int i=1;i<=100;i++) tr[i].resize(10);for(int i=1;i<=n;i++){int f=read();if(f==1){int x=read(),y=read();//printf("%d %d %d\n",f,x,y);p[++cnt]=(node){x,y,cnt};st[cnt]=i;eed[cnt]=n;}else if(f==2){int x=read();eed[x]=i-1;//printf("%d %d\n",f,x);}else{int x=read(),y=read();//printf("%d %d %d\n",f,x,y);ask[++num]=(node){x,y,i};}}sort(p+1,p+1+cnt);for(int i=1;i<=cnt;i++){//printf("i=%d l=%d r=%d\n",i,st[p[i].id],eed[p[i].id]);insert(1,1,n,st[p[i].id],eed[p[i].id],i);}for(int i=1;i<=num;i++){printf("%lld\n",query(1,1,n,ask[i].id,ask[i].x,ask[i].y));}return 0;
}
/*
5
3 84040 650026
3 702678 199950
1 826333 497249
1 133580 956915
3 36119 655069
*/
YBTOJ:向量问题(线段树分治、凸包)相关推荐
- 时空旅行(dfs序+线段树分治+斜率优化)
时空旅行 题意: 给定一棵以000为根的树,每个节点上有信息(一种是增加某个带权三维点,一种是删除某个带权三维点):询问要求从根节点到某个节点的信息总和中找到一个最优带权三维点. 思路: 首先,每个星 ...
- [CTSC2016]时空旅行 (线段树分治)
前言 昨天学习了线段树分治,算法比较抽象,没有学得太具体,今天做一道例题练练手 --自闭前 题面上洛谷 题意 维护若干个集合,每个集合都是由一个编号比它小的集合加入一个二元组(x,c)(x,c)(x, ...
- 时空旅行[线段树分治][维护凸壳]
文章目录 前言 题目 思路 代码 前言 肝了一上午-这是我才学线段树分治的例题-真舒服 题目 温馨提示:首先在UOJ做,LOJ挖数据,BZOJ终极评测... UOJ198 二手剽- 思路 为什么不能用 ...
- 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)
题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...
- 线段树分治 ---- CF1217F - Forced Online Queries Problem(假离线 可撤销并查集 + 线段树分治)详解
题目链接 题目大意 解题思路: 我一开始想到可以用可撤销并查集去维护这种删边加边的操作,但是有个缺点是每次撤销都有把后面的边全部撤销复度是O(n2)O(n^2)O(n2) 首先我们考虑这种动态加边删边 ...
- 3237: [Ahoi2013]连通图 线段树分治
题解: cf765f cf671e bzoj4184 bzoj4552 线段树分治裸题 还是介绍一下线段树分治 这个东西其实挺简单但也挺有用的 可以把删除+插入操作变成只有插入(倒着就是删除) 像这一 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治...
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...
最新文章
- xmanager破解待验证
- mysql栏目表设计_MySQL表设计
- 【嵌入式】C语言高级编程-地址对齐(07)
- java中i+=2什么意思_三分钟看懂Java中i++与++i的性能差别以及循环中如何使用
- Android Activity无法启动。
- 过滤SQL关键字 防注入
- leetcode 14 最长公共前缀(python)
- 计算机会计学ufo报表,《计算机会计学》教学大纲.pdf
- dm9000a驱动源码分析
- FFmpeg基础:视频流转图片
- web前端入门到实战:HTML图像标签img和源属性src及Alt属性、宽高、对齐
- h5策划书_世界睡眠日H5策划方案
- EleutherAI GPT-Neo: 穷人的希望
- 深圳python 培训班价格
- Symmetric Difference
- 加索引如何避免锁表?
- 单向能ping通,反向不通故障解决过程
- SOA架构的第三方物流信息系统分析
- 2022年焊工(初级)上岗证题目及模拟考试
- 将png转换为bmp格式
热门文章
- linux 系统迁移到固态硬盘,把Debian GNU/Linux迁移到SSD上
- 鸿蒙思维和小央美,北市场附近艺术培训
- python实例编程_python 编程实例 5
- 求职华为,被问观察者模式,从没有这种体验!!!
- solr 配置mysql数据源_solr data-config.xml配置文件的见解mysql数据源
- linux中的ip地址范围,linux – ip地址范围参数
- http referer 验证防御方法_渗透测试 跨站攻击防御与安全检测手法剖析
- lnmp无法远程连接mysql_MySQL(一):设置root 可以远程连接MySQL
- 小说中场景的功能_如何让你的小说中的场景转换自如?
- 好用的平板电脑_平板选择华为M6,这里有几点建议