Sdoi2014 向量集
题解:
码力太差重构之后才$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 向量集的更多相关文章
- BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )
答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN) ...
- 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 (|x| ...
- BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)
Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...
- 【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| & ...
- P3309 [SDOI2014]向量集
传送门 达成成就:一人独霸三页提交 自己写的莫名其妙MLE死都不知道怎么回事,照着题解打一直RE一个点最后发现竟然是凸包上一个点求错了--四个半小时就一直用来调代码了-- 那么我们只要维护好这个凸壳, ...
- SDOI 2014 向量集
[SDOI2014]向量集 题目描述 维护一个向量集合,在线支持以下操作: - "A x y (|x|,|y| < =10^8)":加入向量(x,y); - " Q ...
随机推荐
- Codeforces - 9D - How many trees? - 简单dp - 组合数学
https://codeforces.com/problemset/problem/9/D 一开始居然还想直接找公式的,想了想还是放弃了.原来这种结构是要动态规划. 状态是知道怎么设了,$t_{nh} ...
- CentOS 7 设置系统语言为英文并解决 cannot change locale 问题
首次安装Cent OS 7.6时,将系统语言设置成了中文.后续学习和使用过程中却发现种种不便,甚至有翻译错误.为锻炼自己的英文能力,所以将系统语言设置问英文. 编辑 locale 配置文件,将 LAN ...
- 二分图最大匹配初探 By cellur925
一.什么是二分图 首先它需要是一张无向图. 之后它需要同时满足两个条件:①它的N个点被分为两个集合,且这两个集合交集为空:②同一集合内的点之间没有边相连. 二.无向图是否为二分图的判定 引理:无向图是 ...
- 密码(Password)
#include<cstdio> #include<cstring> using namespace std; int k, cnt; ][][], ans[]; bool d ...
- 多线程 线程间通信 wait,notify
1. 方法wait锁释放,notify()锁不释放
- only-child选择器
:only-child选择器用于匹配属于某一个父元素的唯一子元素的元素,也就是说,如果某个父元素仅有一个子元素,则使用 :only-chlid选择器 ,可以选择这个子元素
- 【数据结构(C语言版)系列三】 队列
队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...
- HDU6447(离散化扫描线+树状数组)
一眼看过去就x排序扫描一下,y是1e9的离散化一下,每层用树状数组维护一下,然后像dp倒着循环似的树状数组就用y倒着插就可行了. 类似题目练习:BZOJ4653.BZOJ1218 #pragma co ...
- 在eclipse中配置Tomcat并将项目部署到Tomcat上
参考:http://blog.csdn.net/yerenyuan_pku/article/details/51830104 首先在点击window窗口然后preferences 然后点击Add,选择 ...
- [已读]响应式web设计
去年冲着响应式这三个字买的,很快就读完了,因为说实话都挺浅显的内容.真正涉及到响应式的是第二和第三章(媒体查询 em 百分比图片),其他的h5与css3关系不大.