题目描述

题解:

码力太差重构之后才$A……$

首先求向量点积最大很容易想到凸包,

设已知$(x_0,y_0)$,求$(x,y)$满足$(x,y)*(x_0,y_0)>=(x',y')*(x_0,y_0)$

设$(x,y)*(x_0,y_0)=c$

那么$x*x_0+y*y_0=c$,$y=\frac(-x_0,y_0)*x+\frac(c,x_0)$

所以$x_0>0$时,$b$取最大,维护上凸包;

$x_0<0$时,$b$取最小,维护下凸包。

其实$x_0=0$不需要单独维护,放到任意一堆里二分都行。

由于询问与时间序有关,我们可以按时间建线段树,

每个节点挂一个凸包。

每次询问时从对应凸包二分查最大点积。

插入时并不需要每插一个点就把这个凸包拆开重构,

只需要在子树插满,即$r=x$时建立凸包即可。

代码:

#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3fll;
const double eps = 1e16;
int n,tot;
ll ans;
char s0[],s[];
struct Point
{
ll x,y;
Point(){}
Point(ll x,ll y):x(x),y(y){}
ll operator * (const Point&a)const{return x*a.x+y*a.y;}
ll operator ^ (const Point&a)const{return y*a.x-x*a.y;}
Point operator + (const Point&a)const{return Point(x+a.x,y+a.y);}
Point operator - (const Point&a)const{return Point(x-a.x,y-a.y);}
bool operator < (const Point&a)const{return x==a.x?y<a.y:x<a.x;}
};
vector<Point>tmp[N<<],c1[N<<],c2[N<<];
struct segtree
{
void insert(int l,int r,int u,ll x,ll y,int z)
{
tmp[u].push_back(Point(x,y));
if(z==r)
{
sort(tmp[u].begin(),tmp[u].end());
for(int i=;i<tmp[u].size();i++)
{
while(c1[u].size()>&&((c1[u][c1[u].size()-]-c1[u][c1[u].size()-])^(tmp[u][i]-c1[u][c1[u].size()-]))<=)c1[u].pop_back();
c1[u].push_back(tmp[u][i]);
while(c2[u].size()>&&((c2[u][c2[u].size()-]-c2[u][c2[u].size()-])^(tmp[u][i]-c2[u][c2[u].size()-]))>=)c2[u].pop_back();
c2[u].push_back(tmp[u][i]);
}
}
if(l==r)return ;
int mid = (l+r)>>;
if(z<=mid)insert(l,mid,u<<,x,y,z);
else insert(mid+,r,u<<|,x,y,z);
}
void query(int l,int r,int u,Point p,int ql,int qr)
{
if(l==ql&&r==qr)
{
if(p.y>=)
{
int L = ,R = c1[u].size()-,as = ;
while(L<=R)
{
int mid = (L+R)>>;
if(p*c1[u][mid]>p*c1[u][mid-])as=mid,L=mid+;
else R=mid-;
}
ans=max(ans,p*c1[u][as]);
}else
{
int L = ,R = c2[u].size()-,as = ;
while(L<=R)
{
int mid = (L+R)>>;
if(p*c2[u][mid]>p*c2[u][mid-])as=mid,L=mid+;
else R=mid-;
}
ans=max(ans,p*c2[u][as]);
}
return ;
}
int mid = (l+r)>>;
if(qr<=mid)query(l,mid,u<<,p,ql,qr);
else if(ql>mid)query(mid+,r,u<<|,p,ql,qr);
else query(l,mid,u<<,p,ql,mid),query(mid+,r,u<<|,p,mid+,qr);
}
}tr;
int main()
{
scanf("%d%s",&n,s0);
for(int x,y,l,r,i=;i<=n;i++)
{
scanf("%s%d%d",s,&x,&y);
if(s0[]!='E')x^=ans,y^=ans;
if(s[]=='A')
{
tot++;
tr.insert(,n,,x,y,tot);
}else
{
scanf("%d%d",&l,&r);
if(s0[]!='E')l^=ans,r^=ans;
ans=-inf;
tr.query(,n,,Point(x,y),l,r);
printf("%lld\n",ans);
ans&=0x7fffffff;
}
}
return ;
}

Sdoi2014 向量集的更多相关文章

  1. BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )

    答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN) ...

  2. BZOJ3533 [Sdoi2014]向量集 【线段树 + 凸包 + 三分】

    题目链接 BZOJ3533 题解 我们设询问的向量为\((x_0,y_0)\),参与乘积的向量为\((x,y)\) 则有 \[ \begin{aligned} ans &= x_0x + y_ ...

  3. bzoj3533: [Sdoi2014]向量集

    Description 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);" Q x y l r (|x| ...

  4. BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)

    Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...

  5. 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包

    题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...

  6. bzoj 3533: [Sdoi2014]向量集 线段树维护凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...

  7. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

  8. P3309 [SDOI2014]向量集

    传送门 达成成就:一人独霸三页提交 自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了--四个半小时就一直用来调代码了-- 那么我们只要维护好这个凸壳, ...

  9. SDOI 2014 向量集

    [SDOI2014]向量集 题目描述 维护一个向量集合,在线支持以下操作: - "A x y (|x|,|y| < =10^8)":加入向量(x,y); - " Q ...

随机推荐

  1. Android Fragment使用小结及介绍

    目录(?)[-] 一什么是Fragment 二Fragment的生命周期 三Fragment的两种添加方式addreplace 四两种添加方式性能比较 偶记得第一次接触Fragment,觉得好牛叉的组 ...

  2. vs2010中的ADO控件及绑定控件

    要在项目中添加某一个ActiveX控件,则该ActiveX控件必须要注册.由于VS2010中,并没有自动注册ADO及ADO数据绑定控件(Microsoft ADO Data Control,Micro ...

  3. bzoj 4909 [Sdoi2017]龙与地下城

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4909 题解 目前为止仅仅在LOJ上A掉这道题(Loj真快!) 当然不是标准做法 显然我们只要 ...

  4. 1-20StringBuffer简介

    StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer. 工作原理 StringBuffer的底层是char数组,如果没有明确设定,则系统会默认 ...

  5. EJB Timer Service is not available. Timers for application with id 95795415990861824 will not be deleted

    delete follows:glassfish\domains\domain1\applications\ejb-timer-service-appglassfish\domains\domain1 ...

  6. selenium处理的操作

  7. ImageView加载长图(适用不需要缩放的情况)

    此案例适用于加载网络长图且图片的宽和高已知的情况.由于ImageView加载图片有一个4096*4096的限制,所以对于巨长图的加载比较麻烦,需要我们自己去手动处理. 有两种解决方案:第一种就是比较l ...

  8. python_函数嵌套(4)

    第1章 名称空间 1.1 定义 1.2 变量运行流程 1.3 临时名称空间 1.4 python三种名称空间 第2章 作用域 2.1 作用域分类 2.2 加载顺序 2.3 取值顺序 函数嵌套 2.4 ...

  9. 导Excel数据表

    需要把EXcel转换格式:

  10. WebForm中 页面传参的总结

    页面与后台的数据传递是实现动态页面的前提---数据交互.无论是MVC还是WebFrom 都需要详细了解各种前后台的数据传输方式,熟悉每种方式的优缺点,这样才能提高网站的性能,技术上得到锻炼. 1.Fo ...