题目描述

题解:

码力太差重构之后才$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. poj1312dfs基础

    就是很简单的DFS-因为数据偏小,上去就是干了 #include <stdio.h> #include <string.h> #include <math.h> # ...

  2. 给Clouderamanager集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)

    这个很简单,在集群机器里,选择就是了,本来自带就有Impala的. 扩展博客 给Ambari集群里安装基于Hive的大数据实时分析查询引擎工具Impala步骤(图文详解)

  3. iOS 上传的图片在HTML上显示时,图片方向信息(EXIF Orientation)异常

    将iPhone 6s拍摄的照片上传到服务器之后, 在Web网页上看到图片被逆时针旋转了90度, 这让我很惆怅呐! 出现这个问题其实是因为上传的图片为.jpg格式,.jpg文件含有EXIF信息, 其中E ...

  4. 从输入url到浏览器显示页面的过程

    总体来说有两个大的方面: 一.网络通信连接部分.二.页面渲染展示部分. 细分详细过程: (网络通信) 1.输入url. 2.DNS解析域名. 3.拿到IP地址后,浏览器向服务器建立tcp连接. 4.浏 ...

  5. Android课程设计第四天ListView运用

    注意:课程设计只为完成任务,不做细节描述~ 效果图 <?xml version="1.0" encoding="utf-8"?> <Relat ...

  6. What's mean ORA-25191?

    1.在给表授权的时候.报错ORA-25191 检查该表为IOT 表 . --因为不是按照单表方式授予权限,而是按照用户的方式授予权限,所以该表的父亲表都在该用户下,所以这个报错可以忽略. 2/ 在参考 ...

  7. 当css样式表遇到层2

    9.定制层的display属性:层的表现是通过框这种结构来实现的.框可以是块级对象也可以是行内对象. Display属性就是用来控制其中内容是块级还是行级.定义为block则为kuai块级,inlin ...

  8. Error: IO_ERROR : java.io.IOException: Error while connecting Oozie server. No of retries = 5. Exception = Connection refused (Connection refused)解决办法(图文详解)

    不多说,直接上干货! 问题详情 解决办法 Copy/Paste oozie.services property tag set from oozie-default.xml to oozie-site ...

  9. neo4j(图数据库)是什么?

    不多说,直接上干货! 作为一款强健的,可伸缩的高性能数据库,Neo4j最适合完整的企业部署或者用于一个轻量级项目中完整服务器的一个子集存在. 它包括如下几个显著特点: 完整的ACID支持 高可用性 轻 ...

  10. OpenGL 透视投影推导图解

    有它足够了,转载自:http://blog.sina.com.cn/s/blog_73428e9a0102v920.html