[BZOJ4311]向量(凸包+三分+线段树分治)
可以发现答案一定在所有向量终点形成的上凸壳上,于是在上凸壳上三分即可。
对于删除操作,相当于每个向量有一个作用区间,线段树分治即可。$O(n\log^2 n)$
同时可以发现,当询问按斜率排序后,每个凸壳上的决策点也是单调变化的,于是可以记录每次的决策位置。$O(n\log n)$
$O(n\log^2 n)$:
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<algorithm>
- #define ls (x<<1)
- #define rs (ls|1)
- #define lson ls,L,mid
- #define rson rs,mid+1,R
- #define rep(i,l,r) for (int i=(l); i<=(r); i++)
- typedef long long ll;
- using namespace std;
- const int N=;
- int n,op,x,y,tim,tot,d[N<<];
- struct P{ ll x,y; };
- struct D{ int l,r; P p; }p[N],q[N];
- vector<P>v[N<<];
- P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y}; }
- ll operator *(P a,P b){ return a.x*b.y-a.y*b.x; }
- 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; }
- bool cmp2(const D &a,const D &b){ return a.p*b.p<; }
- ll calc(P a,P b){ return a.x*b.x+a.y*b.y; }
- void ins(int x,int L,int R,int l,int r,P p){
- if (l<=L && R<=r){
- while (v[x].size()> && (v[x][v[x].size()-]-v[x][v[x].size()-])*(p-v[x][v[x].size()-])>=) v[x].pop_back();
- v[x].push_back(p); return;
- }
- int mid=(L+R)>>;
- if (l<=mid) ins(lson,l,r,p);
- if (r>mid) ins(rson,l,r,p);
- }
- ll que(int x,int L,int R,int pos,P p){
- ll ans=;
- if (v[x].size()){
- int l=,r=v[x].size()-;
- while (l+<r){
- int m1=l+(r-l)/,m2=r-(r-l)/;
- if (calc(p,v[x][m1])>calc(p,v[x][m2])) r=m2; else l=m1;
- }
- rep(i,l,r) ans=max(ans,calc(p,v[x][i]));
- }
- if (L==R) return ans;
- int mid=(L+R)>>;
- if (pos<=mid) return max(ans,que(lson,pos,p)); else return max(ans,que(rson,pos,p));
- }
- int main(){
- freopen("bzoj4311.in","r",stdin);
- freopen("bzoj4311.out","w",stdout);
- scanf("%d",&n);
- rep(i,,n){
- scanf("%d",&op);
- if (op==) scanf("%d%d",&x,&y),p[++tim]=(D){i,n,x,y};
- if (op==) scanf("%d",&x),p[x].r=i;
- if (op==) scanf("%d%d",&x,&y),q[++tot]=(D){i,tot,x,y};
- }
- sort(p+,p+tim+,cmp1);
- rep(i,,tim) ins(,,n,p[i].l,p[i].r,p[i].p);
- rep(i,,tot) printf("%lld\n",que(,,n,q[i].l,q[i].p));
- return ;
- }
$O(n\log n)$
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<algorithm>
- #define ls (x<<1)
- #define rs (ls|1)
- #define lson ls,L,mid
- #define rson rs,mid+1,R
- #define rep(i,l,r) for (int i=(l); i<=(r); i++)
- typedef long long ll;
- using namespace std;
- const int N=;
- ll ans[N];
- int n,op,x,y,tim,tot,d[N<<];
- struct P{ ll x,y; };
- struct D{ int l,r; P p; }p[N],q[N];
- vector<P>v[N<<];
- P operator -(P a,P b){ return (P){a.x-b.x,a.y-b.y}; }
- ll operator *(P a,P b){ return a.x*b.y-a.y*b.x; }
- 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; }
- bool cmp2(const D &a,const D &b){ return a.p*b.p<; }
- ll calc(P a,P b){ return a.x*b.x+a.y*b.y; }
- void ins(int x,int L,int R,int l,int r,P p){
- if (l<=L && R<=r){
- while (v[x].size()> && (v[x][v[x].size()-]-v[x][v[x].size()-])*(p-v[x][v[x].size()-])>=) v[x].pop_back();
- v[x].push_back(p); return;
- }
- int mid=(L+R)>>;
- if (l<=mid) ins(lson,l,r,p);
- if (r>mid) ins(rson,l,r,p);
- }
- ll que(int x,int L,int R,int pos,P p){
- ll ans=;
- if (v[x].size()){
- while (d[x]<(int)v[x].size()- && calc(p,v[x][d[x]+])>=calc(p,v[x][d[x]])) d[x]++;
- ans=calc(p,v[x][d[x]]);
- }
- if (L==R) return ans;
- int mid=(L+R)>>;
- if (pos<=mid) return max(ans,que(lson,pos,p)); else return max(ans,que(rson,pos,p));
- }
- int main(){
- freopen("bzoj4311.in","r",stdin);
- freopen("bzoj4311.out","w",stdout);
- scanf("%d",&n);
- rep(i,,n){
- scanf("%d",&op);
- if (op==) scanf("%d%d",&x,&y),p[++tim]=(D){i,n,x,y};
- if (op==) scanf("%d",&x),p[x].r=i;
- if (op==) scanf("%d%d",&x,&y),q[++tot]=(D){i,tot,x,y};
- }
- sort(p+,p+tim+,cmp1);
- rep(i,,tim) ins(,,n,p[i].l,p[i].r,p[i].p);
- sort(q+,q+tot+,cmp2);
- rep(i,,tot) ans[q[i].r]=que(,,n,q[i].l,q[i].p);
- rep(i,,tot) printf("%lld\n",ans[i]);
- return ;
- }
[BZOJ4311]向量(凸包+三分+线段树分治)的更多相关文章
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- BZOJ4311 向量(线段树分治+三分)
由点积的几何意义(即投影)可以发现答案一定在凸壳上,并且投影的变化是一个单峰函数,可以三分.现在需要处理的只有删除操作,线段树分治即可. #include<iostream> #inclu ...
- 【BZOJ4311】向量(线段树分治,斜率优化)
[BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...
- bzoj4311向量(线段树分治+斜率优化)
第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2) ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
随机推荐
- 下拉刷新和UITableView的section headerView冲突的原因分析与解决方案
UITableView:下拉刷新和上拉加载更多 [转载请注明出处] 本文将说明具有多个section的UITableView在使用下拉刷新机制时会遇到的问题及其解决方案. 工程地址在帖子最下方,只需要 ...
- Spring Boot中对log4j进行多环境不同日志级别的控制
之前介绍了在<Spring boot中使用log4j记录日志>,仅通过log4j.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需 ...
- [NOIP2003]栈 题解(卡特兰数)
[NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序 ...
- VS 2010 应用程序无法启动
其实一般遇到这种问题, 不管是debug还是release, 也不用看提示的内存地址, 首先应该想到库是否包含正确. 一个可能的错误就是32位或64位不匹配的错误. 比如环境变量设的是64位的Open ...
- jQuery的validation插件(验证表单插件)
更完整的参考:http://www.runoob.com/jquery/jquery-plugin-validate.html 验证隐藏字段的使用(验证通过后ajax提交表单):http://www. ...
- React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot
〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...
- Springboot swagger2 导出api文档
具体导出的代码,参考了:http://www.spring4all.com/article/699 导出前,首先需要配置好swagger2,参见 https://www.cnblogs.com/yan ...
- sklearn逻辑回归(Logistic Regression)类库总结
class sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_inter ...
- ubuntu下安装tftp服务器(转)
安装了好几次tftp服务器,每次在网上找安装方法,找到的都不一样,有的能用,有的不能用,先把一个能用的版本做一个备忘. 参考链接:http://www.cnblogs.com/geneil/archi ...
- nginx allow 多个ip & ipv4的网段表示方法解析
参考:https://www.baidu.com/link?url=5aVe_syihQzhHnSDAdLsNNQYqDe_W2GYG1GeIQ130e4mEZbusxQfqGVTdg-dJg8fqM ...