题目描述

维护一个向量集合,在线支持以下操作:
"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)的点积的最大值。
    集合初始时为空


输入格式

输入的第一行包含整数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。


输出格式

对每个Q操作,输出一个整数表示答案。

提示

1 < =N < =4×10^5

新加数据一组..2015.315


  • 题解

    • 设当前向量为$(a,b)$集合中向量为$(x,y)$,设$z = ax+by$,有$y =  - \frac{a}{b} x + \frac{z}{b}$
    • 最优化$z$:
      • 当$b>0$即求过集合$S$中的某个点且斜率为$ - \frac{a}{b}$的直线$y$截距最大的为哪条,答案一定在上凸包上;
      • 同理$b<0$时求截距最小的为哪条;
      • $b==0$随便哪条查即可;
    • 如果维护了区间$[L,R]$的凸包就可以在里面三分;
    • 应该是可以用线段树套$splay$参照$bzoj2300$但是效率比较低;
    • 考虑直接用线段树,由于标号是顺序更新,所以一段区间的最后一个点被加入后再求区间的凸包,查询线段树查询+三分;
    • 实现上凸包的排序可以用归并,(然而并没有快TAT);
    • O(n \ log^2  \ n )
 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<set>
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define ll long long
#define ld long double
#define mk make_pair
#define fir first
#define sec second
#define il inline
#define rg register
#define pb push_back
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
const int N=;
const ll inf=1e18;
int n,cnt,sz[N<<],L[][N<<],R[][N<<];
ll ans=;
struct poi{
ll x,y;
poi(int _x=,int _y=):x(_x),y(_y){};
poi operator-(const poi&A)const{return poi(x-A.x,y-A.y);}
bool operator <(const poi&A)const{return x==A.x?y<A.y:x<A.x;}
}con[][N],Q,tmp[][N],p[N];
il char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=,f=; char c=gc();
while(c<''||c>''){if(c=='-')f=-;c=gc();}
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x*f;
}
il ll dot(poi A,poi B){return (ll)A.x*B.x+(ll)A.y*B.y;}
il ll crs(poi A,poi B){return (ll)A.x*B.y-(ll)A.y*B.x;}
il ll max(ll x,ll y){return x>y?x:y;}
il void build(int k,int d,int l,int r){
int mid=(l+r)>>,idl=l,idr=mid+,id=l,top,lst;
for(;idl<=mid||idr<=r;){
if(idr>r||(idl<=mid&&tmp[d+][idl]<tmp[d+][idr]))
tmp[d][id]=tmp[d+][idl],id++,idl++;
else
tmp[d][id]=tmp[d+][idr],id++,idr++;
}
con[d][L[][k]=top=l]=tmp[d][l];
for(rg int i=l+;i<=r;++i){
while(top>l&&crs(con[d][top]-con[d][top-],tmp[d][i]-con[d][top])<=)top--;
con[d][++top]=tmp[d][i];
}
R[][k]=L[][k]=lst=top;
for(rg int i=r-;i>=l;--i){
while(top>lst&&crs(con[d][top]-con[d][top-],tmp[d][i]-con[d][top])<=)top--;
if(i!=l)con[d][++top]=tmp[d][i];
}
R[][k]=top;
}
il void ask(int k,int d,int typ){
int l=L[typ][k],r=R[typ][k];
while(r-l>=){
int mid=(r-l)/,mid1=l+mid,mid2=r-mid;
if(dot(con[d][mid1],Q)<dot(con[d][mid2],Q))l=mid1;
else r=mid2;
}
for(rg int i=l;i<=r;++i)ans=max(ans,dot(con[d][i],Q));
ans=max(ans,dot(con[d][L[][k]],Q));
}
il void update(int k,int d,int l,int r,int x){
if(l==r){
sz[k]=;
L[][k]=L[][k]=R[][k]=R[][k]=x;
tmp[d][x]=con[d][x]=p[x];
}
else{
int mid=(l+r)>>;
if(x<=mid)update(ls,d+,l,mid,x);
else update(rs,d+,mid+,r,x);
sz[k]=sz[ls]+sz[rs];
if(sz[k]==r-l+)build(k,d,l,r);
}
}
il void query(int k,int d,int l,int r,int x,int y){
if(l==x&&r==y){ask(k,d,Q.y>);}
else{
int mid=(l+r)>>;
if(y<=mid)query(ls,d+,l,mid,x,y);
else if(x>mid)query(rs,d+,mid+,r,x,y);
else query(ls,d+,l,mid,x,mid),query(rs,d+,mid+,r,mid+,y);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj3533.in","r",stdin);
freopen("bzoj3533.out","w",stdout);
#endif
char ch,tp;int x,y,l,r;
n=rd();tp=gc();
while(!isalpha(tp))tp=gc();
for(rg int i=;i<=n;++i){
ch=gc();while(!isalpha(ch))ch=gc();
if(ch=='A'){
x=rd();y=rd();
if(tp!='E')x^=ans,y^=ans;
p[++cnt]=poi(x,y);
update(,,,n,cnt);
}else{
x=rd();y=rd();l=rd();r=rd();
if(tp!='E')x^=ans,y^=ans,l^=ans,r^=ans;
Q=(poi){x,y};
ans = -inf;
query(,,,n,l,r);
printf("%lld\n",ans);
ans &= 0x7fffffff;
}
}
return ;
}//by tkys_Austin;

bzoj3533

bzoj3533【Sdoi2014】向量集的更多相关文章

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

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

  2. bzoj3533: [Sdoi2014]向量集

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

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

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

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

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

  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. Sdoi2014 向量集

    题目描述 题解: 码力太差重构之后才$A……$ 首先求向量点积最大很容易想到凸包, 设已知$(x_0,y_0)$,求$(x,y)$满足$(x,y)*(x_0,y_0)>=(x',y')*(x_0 ...

  9. P3309 [SDOI2014]向量集

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

  10. SDOI 2014 向量集

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

随机推荐

  1. Linux 文件系统 -- 简述几种文件类型

    Linux 中一切皆为文件,文件类型也有多种,使用 ls -l 命令可以查看文件的属性,所显示结果的第一列的第一个字符用来表明该文件的文件类型,如下: 1.普通文件 使用 ls -l 命令后,第一列第 ...

  2. Docker入门与实践之 Dockerfile 语法详解

    一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...

  3. Golang 2018.1.2激活及使用技巧

    对于做Java开发的同学使用最熟练的开发工具应该当属Eclipse了吧,但是做到后面的话一般都会转用Intellij Idea.至于转用Intellij有什么好处我就不赘述了,简言之就是功能强大,使用 ...

  4. python基础网络编程--转

    python之网络编程 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的 ...

  5. python json模块使用详情

    python其他知识目录 #json.数据交换用到json文件.json是特殊的字符串.访问网站,返回的就是json 1.json简介: 定义:JSON(JavaScript Object Notat ...

  6. Daily Scrum (2015/10/31)

    这几天我们组的进度有点慢,剩下这一周的我们必须要加油认真对待. 周末这两天我们是这样安排的: 成员 今日任务 时间 明日任务 符美潇 数据库部分代码的编写 1h 每周小组例会 潘礼鹏 团队博客作业   ...

  7. vim搭建C编程IDE

    曾经在一篇关于vim技巧的文章里有一句话:"世界上只有三种编辑器,EMACS.VIM和其它." 我不知道这是不是太过于绝对了,但是从我所看到的每一篇linux下编程以及文字编辑的文 ...

  8. php----函数大全

    字符串函数 数组函数 数学函数

  9. 第1阶段冲刺成果—简单运算game(APP)

    第1阶段冲刺成果 由于我们团队都没有Android的基础,所以在这一块花了很长的时间去学习探索,就连简单的Android的电脑配置也花了很长的时间,所以其他的DONE的都没有完成,这是失败的地方.但是 ...

  10. 计算机网络的服务质量(QoS)

    QoS入门,为了进一步学习DPDK上的QoS <计算机网络的服务质量(QoS)> 林闯,单志广,任丰原 著 Background Internet的传统分组交换网络是面向非实时数据通信而设 ...