bzoj3533: [Sdoi2014]向量集
Description
维护一个向量集合,在线支持以下操作:
"A x y (|x|,|y| < =10^8)":加入向量(x,y);
" Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值。
集合初始时为空。
Input
输入的第一行包含整数N和字符s,分别表示操作数和数据类别;
接下来N行,每行一个操作,格式如上所述。
请注意s≠'E'时,输入中的所有整数都经过了加密。你可以使用以下程序
得到原始输入:
inline int decode (int x long long lastans) {
return x ^ (lastans & Ox7fffffff);
}
function decode
begin
其中x为程序读入的数,lastans为之前最后一次询问的答案。在第一次询问之前,lastans=0。
注:向量(x,y)和(z,W)的点积定义为xz+yw。
Output
对每个Q操作,输出一个整数表示答案。
#include<cstdio>
#include<algorithm>
typedef long long i64;
char buf[],*ptr=buf,*pmx=buf+;
const i64 inf=1ll<<;
const int N=1e7;
int g(){
if(ptr==pmx)fread(ptr=buf,,,stdin);
return *ptr++;
}
int _(){
int x=,f=,c=g();
while(c<||c>)c=='-'&&(f=-),c=g();
while(c>&&c<)x=x*+c-,c=g();
return x*f;
}
int _c(){
int c=g();
while(c<'A'||c>'Z')c=g();
return c;
}
void maxs(i64&a,i64 b){if(a<b)a=b;}
void maxs(int&a,int b){if(a<b)a=b;}
void mins(int&a,int b){if(a>b)a=b;}
struct pos{
int x,y;
i64 operator()(pos a){
return i64(x)*a.x+i64(y)*a.y;
}
}mem[],*mp=mem;
pos operator-(pos a,pos b){
return (pos){a.x-b.x,a.y-b.y};
}
i64 operator*(pos a,pos b){
return i64(a.x)*b.y-i64(a.y)*b.x;
}
bool operator<(pos a,pos b){
return a.x!=b.x?a.x<b.x:a.y<b.y;
}
struct node{
pos*l,*r;
void init(int x,int y){
l=mp;
*mp++=(pos){x,y};
r=mp;
}
void ins(pos x){
if(mp>l&&mp[-].x==x.x)--mp;
while(mp-l>=&&(x-mp[-])*(mp[-]-mp[-])>=)--mp;
*mp++=x;
}
void init(node a,node b){
if(!a.l)*this=b;
else if(!b.l)*this=a;
else{
l=mp;
pos*ap=a.l,*bp=b.l;
while(ap!=a.r&&bp!=b.r){
if(*ap<*bp)ins(*ap++);
else ins(*bp++);
}
while(ap!=a.r)ins(*ap++);
while(bp!=b.r)ins(*bp++);
r=mp;
}
}
i64 find(pos x){
if(!l)return -1ll<<;
i64 v1,v2;
int L=,R=r-l-,M1,M2;
while(R-L>){
M1=L+R>>;
M2=M1+;
if(x(l[M1])<x(l[M2]))L=M1;
else R=M2;
}
for(v1=x(l[L++]);L<=R;++L)maxs(v1,x(l[L]));
return v1;
}
}us[],ds[];
bool d[];
int n,de,la=,x,y,l,r,id=;
int main(){
n=_();de=_c()!='E';
for(int i=;i<n;++i){
if(_c()=='A'){
x=_();y=_();++id;
if(de)x^=la,y^=la;
int w=id+;
us[w].init(x,y);
ds[w].init(x,-y);
d[w]=;
for(w>>=;w&&d[w<<^];w>>=){
us[w].init(us[w<<],us[w<<^]);
ds[w].init(ds[w<<],ds[w<<^]);
d[w]=;d[w<<^]=;
}
}else{
x=_();y=_();l=_();r=_();
if(de)x^=la,y^=la,l^=la,r^=la;
i64 ans=-1ll<<;
pos p1=(pos){x,y},p2=(pos){x,-y};
for(l+=,r+=;l^r^;l>>=,r>>=){
if(~l&)maxs(ans,us[l^].find(p1)),maxs(ans,ds[l^].find(p2));
if(r&)maxs(ans,us[r^].find(p1)),maxs(ans,ds[r^].find(p2));
}
printf("%lld\n",ans);
la=ans&0x7fffffff;
}
}
return ;
}
bzoj3533: [Sdoi2014]向量集的更多相关文章
- BZOJ3533 [Sdoi2014]向量集 【线段树 + 凸包 + 三分】
题目链接 BZOJ3533 题解 我们设询问的向量为\((x_0,y_0)\),参与乘积的向量为\((x,y)\) 则有 \[ \begin{aligned} ans &= x_0x + y_ ...
- BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)
Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...
- BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )
答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN) ...
- 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包
题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...
- bzoj 3533: [Sdoi2014]向量集 线段树维护凸包
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...
- bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题
题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...
- Sdoi2014 向量集
题目描述 题解: 码力太差重构之后才$A……$ 首先求向量点积最大很容易想到凸包, 设已知$(x_0,y_0)$,求$(x,y)$满足$(x,y)*(x_0,y_0)>=(x',y')*(x_0 ...
- P3309 [SDOI2014]向量集
传送门 达成成就:一人独霸三页提交 自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了--四个半小时就一直用来调代码了-- 那么我们只要维护好这个凸壳, ...
- SDOI 2014 向量集
[SDOI2014]向量集 题目描述 维护一个向量集合,在线支持以下操作: - "A x y (|x|,|y| < =10^8)":加入向量(x,y); - " Q ...
随机推荐
- 【转】java环境配置
JAVA开发环境的搭建(配置JAVA开发环境) 一.安装JDK 1. JVM(Java Virtual Machine—Java虚拟机) JRE(Java Runtime Environment—Ja ...
- sprintf 用法
字符串格式化命令,主要功能是把格式化的数据写入某个字符串中 试试下面的代码就知道了 #include<cstdio> #include<cstdlib> using names ...
- 分享"狼用"API一個
API People that are interested in using our service for automated caching of their newly created .to ...
- 颜色追踪块CamShift---33
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 颜色追踪块CamShift滤波器. 首先确保你的kinect驱动或者uvc相机驱动能正常启动:(如果你使 ...
- leetcode 109 Convert Sorted List to Binary Search Tree ----- java
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- JavaScript学习记录总结(四)——js函数的特殊性
<script type="text/javascript"> //当局部变量与全局变量 重名的时候 var v="全局变量";//定义全局变 ...
- Json学习篇
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行 ...
- 跟上节奏 大数据时代十大必备IT技能(转)
新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT发展趋势,使得IT人必须了解甚至掌握最 ...
- 由<a>标签的onclick影出来的问题
今天做了一个 通过 document.getElementByName()的方法获得一个标签a的集合.tag_a=window.docu..... 接着需要给每个标签都加一个onclick事件. fo ...
- CSS 通用原子类
/*文字排版*/.f10 { font-size: 10px; }.f11 { font-size: 11px; }.f12 { font-size: 12px; }.f13 { font-size: ...