题目描述

题解:

码力太差重构之后才$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. 51nod 1596 搬货物(二进制处理)

    传送门 题意 分析 只要从小到大二进制处理即可 我一直遍历了1->n,应该是0->1e6+1000 果然智障 trick 代码 #include<cstdio> #includ ...

  2. 51nod 1133【贪心】

    思路: 按照终点升序,然后遍历一下就好了: #include <bits/stdc++.h> using namespace std; typedef long long LL; cons ...

  3. 2016 Multi-University Training Contest 2 A Acperience

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 题意: 略. 思路: 略....真分数... = =.我今天是纠结去死了.哎,继续加油,就比如gfd说的还有下一场,下下场,不要烦,不要绝望,因为,这算什么? )扔份代 ...

  4. python string类型 bytes类型 bytearray类型

    一.python3对文本和二进制数据做了区分.文本是Unicode编码,str类型,用于显示.二进制类型是bytes类型,用于存储和传输.bytes是byte的序列,而str是unicode的序列. ...

  5. 问题 3: 糖果数(candy)

    问题 3: 糖果数(candy) 题目描述 学校准备去春游,委托小明分发糖果,每位同学一袋,数量随机. 一共有N袋糖果,编号为1到N,小明拿了从编号a袋到编号b袋的糖果去分发,小明想知道,他一共拿了多 ...

  6. 第十七篇 .NET高级技术之XML

    Xml 简介(可扩展标记语言) XML优点:容易读懂:格式标准任何语言都内置了XML分析引擎,不用单独进行文件分析引擎的编写. Xml就是用一种格式化的方式来存储数据,我们可以通过用记事本打开. .n ...

  7. python之使用request模块发送post和get请求

    import requestsimport json #发送get请求并得到结果# url = 'http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑马 ...

  8. ES6中的Rest参数和默认参数

    ES6中的Rest参数和默认参数 Rest参数 一个例子 编写一个函数, 用来判断, 某个字符串中, 是否其他的字符串, 如果第一参数以后的字符串, 都包含在第一参数中, 都包含在, 就返回true ...

  9. 用户名密码登录小程序及input与raw_input区别。

    一.此次程序需要实现: 1.设定固定的用户名密码 2.用户名密码输入正确打印登录正确信息 3.仅仅运行三次登录 二.本次使用的python版本为: Windows下版本号: C:\Users\dais ...

  10. Coursera:一流大学免费在线课程平台

    https://www.coursera.org/ 微软联合创始人 Bill Gates 从公司退隐后,一直和妻子 Melinda 忙于公益事业.但离开 IT 圈并未改变他穿廉价衬衫和保持学习的习惯— ...