题意:要求支持三个操作,加入删除一个向量,询问当前向量与给定向量的最大值。

题解:线段树时间分治,每个区间做一个凸包,查询的时候到对应区间的凸包上三分。

(话说我这个可能有点问题,三分那一块R-L>=20我才过的。。)

 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 300005 inline LL read(){
LL x=,f=; char a=getchar();
while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
while(a>='' && a<='') x=x*+a-'',a=getchar();
return x*f;
} int n,cnt,st[N],ed[N],qnum,root,ti[N];
LL ans; struct point{
LL x,y;
bool operator < (const point& w)const{
if(x==w.x) return y<w.y;
return x<w.x;
}
}p[N],Q[N],tmp[N]; point operator - (const point& a,const point& b){return (point){a.x-b.x,a.y-b.y};} inline LL cross(point a,point b){return a.x*b.y-a.y*b.x;} LL operator * (const point& a,const point& b){
return a.x*b.x+a.y*b.y;
} struct segment{
int l,r;
vector<point>s;
}a[*N]; void build(int k,int l,int r){
a[k].l=l; a[k].r=r;
if(l==r) return;
int mid=(l+r)>>;
build(k<<,l,mid); build(k<<|,mid+,r);
} void insert(int k,int L,int R,int x){
int l=a[k].l,r=a[k].r;
if(l==L && r==R) {a[k].s.push_back(p[x]); return;}
int mid=(l+r)>>;
if(R<=mid) insert(k<<,L,R,x);
else if(mid<L) insert(k<<|,L,R,x);
else insert(k<<,L,mid,x),insert(k<<|,mid+,R,x);
} void convexhull(int k){
if(!a[k].l) return;
int len=a[k].s.size();
sort(a[k].s.begin(),a[k].s.end());
int top=;
for(int i=;i<len;i++){
while(top> && cross(a[k].s[i]-tmp[top-],tmp[top]-tmp[top-])>=) top--;
tmp[++top]=a[k].s[i];
}
int tt=top;
for(int i=len-;i>=;i--){
while(top>tt && cross(a[k].s[i]-tmp[top-],tmp[top]-tmp[top-])>=) top--;
tmp[++top]=a[k].s[i];
}
if(len>) top--;
a[k].s.clear();
for(int i=;i<=top;i++) a[k].s.push_back(tmp[i]);
convexhull(k<<); convexhull(k<<|);
} void query(int k,int pos,int num){
int l=a[k].l,r=a[k].r;
int L=,R=a[k].s.size()-;
while(R-L>=){
int ll=L+(R-L)/,rr=R-(R-L)/;
if(Q[num]*a[k].s[ll]>Q[num]*a[k].s[rr]) R=rr;
else L=ll;
}
for(int i=L;i<=R;i++)
ans=max(ans,Q[num]*a[k].s[i]);
if(l==r) return;
int mid=(l+r)>>;
if(pos<=mid) query(k<<,pos,num);
else query(k<<|,pos,num);
} int main(){
n=read();
for(int i=;i<=n;i++){
int type=read();
if(type==) p[++cnt].x=read(),p[cnt].y=read(),st[cnt]=i;
else if(type==) ed[read()]=i;
else Q[++qnum].x=read(),Q[qnum].y=read(),ti[qnum]=i;
}
build(,,n);
for(int i=;i<=cnt;i++) if(!ed[i]) ed[i]=n;
for(int i=;i<=cnt;i++) insert(,st[i],ed[i],i);
convexhull();
for(int i=;i<=qnum;i++) ans=,query(,ti[i],i),printf("%lld\n",ans);
return ;
}

BZOJ4311:向量的更多相关文章

  1. [BZOJ4311]向量(凸包+三分+线段树分治)

    可以发现答案一定在所有向量终点形成的上凸壳上,于是在上凸壳上三分即可. 对于删除操作,相当于每个向量有一个作用区间,线段树分治即可.$O(n\log^2 n)$ 同时可以发现,当询问按斜率排序后,每个 ...

  2. BZOJ4311 : 向量

    考虑离线操作,求出每个向量存在的时间区间,用时间线段树来进行分治,在每个节点求出凸壳后,询问时在凸壳上三分答案.时间复杂度$O(n\log^2n)$. #include<cstdio> # ...

  3. 2019.02.26 bzoj4311: 向量(线段树分治+凸包)

    传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...

  4. BZOJ4311 向量(线段树分治+三分)

    由点积的几何意义(即投影)可以发现答案一定在凸壳上,并且投影的变化是一个单峰函数,可以三分.现在需要处理的只有删除操作,线段树分治即可. #include<iostream> #inclu ...

  5. bzoj4311向量(线段树分治+斜率优化)

    第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2) ...

  6. 【BZOJ4311】向量(线段树分治,斜率优化)

    [BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...

  7. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

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

  8. BZOJ4311:向量——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4311 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 ...

  9. 机器学习实战笔记(Python实现)-05-支持向量机(SVM)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

随机推荐

  1. jmeter安装启动报错:Not able to find Java executable or version. Please check your Java installation

    1.xp安装jmeter后启动,出现下面错误,找了很多方法试了,都没有用: 2.最后找到一个方法解决了[感谢无名大神],在环境变量PATH中添加:%SystemRoot%/system32;%Syst ...

  2. MySQL索引使用:字段为varchar类型时,条件要使用''包起来

    结论: 当MySQL中字段为int类型时,搜索条件where num='111' 与where num=111都可以使用该字段的索引.当MySQL中字段为varchar类型时,搜索条件where nu ...

  3. 《PhotoShop CS6 》第一节 矢量与分辨率

    分辨率:不一定是方形,可以调整其比例. 色彩模型:色相Hue(圆周,冷暖相接),饱和度Saturation(半径),明度Brightness(轴,从黑到白).

  4. 深度强化学习资料(视频+PPT+PDF下载)

    https://blog.csdn.net/Mbx8X9u/article/details/80780459 课程主页:http://rll.berkeley.edu/deeprlcourse/ 所有 ...

  5. 【BZOJ4821】[Sdoi2017]相关分析 线段树

    [BZOJ4821][Sdoi2017]相关分析 Description Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. ...

  6. 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)

    [BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n ...

  7. event.preventDefault方法的使用

    event.preventDefault()方法是用于取消事件的默认行为,例如,当点击提交按钮时阻止对表单的提交.但此方法并不被ie支持,在ie下需要用window.event.returnValue ...

  8. GBK和UTF-8文字编码的区别

    UTF-8是一种国际化标准的文字编码,我们已知Windows系统程序已经将最初的UTF-8转向Unicode,而GBK的存在是为了中国国情而创造的,不过GBK也将伴随着中文字符的一直流传下去. GBK ...

  9. Selenium chrome配置不加载图片

    from selenium import webdriver chrome_options = webdriver.ChromeOptions() prefs = {"profile.man ...

  10. app开发制作会难吗?app开发好学吗?

    前面我们讲到了app是什么,APP是运行在智能手机的第三方应用程序,可以满足用户的不同需求.那么app开发制作会难吗?这个与产品的复杂度有很大的关系,复杂度包括业务逻辑多不多,业务模块多不多等,对于玩 ...