【SDOI2014】向量集
【SDOI2014】向量集
我们分析一波:
假设我们询问\((A,B)\),\(x_i>x_j\)若
A\cdot(x_i-x_j)>B\cdot(y_j-y_i)
\]
当\(B>0\)
\]
否则
\]
所以,对于\(B>0\),我们在上凸壳上三分,否则在下凸壳上三分。\(B=0\)随意。
三分细节:条件是\(r-l\geq 3\),然后两个端点是\(\frac{l+l+r}{3}\)以及\(\frac{l+r+r}{3}\)。
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 1e16
#define eps 1e-7
#define N 400005
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n;
ll ans;
char type;
int decode(int x) {return (type!='E')?x^(ans&0x7fffffff):x;}
struct point {
double x,y;
bool operator <(const point &a)const {return x<a.x;}
};
double slope(const point &a,const point &b) {
if(fabs(a.x-b.x)<eps) return a.y<b.y?inf:-inf;
return (a.y-b.y)/(a.x-b.x);
}
double cdot(const point &a,const point &b) {return a.x*b.x+a.y*b.y;}
vector<point>tem;
struct Convex {
vector<point>st;
int size() {return st.size();}
void Insert(point a) {st.push_back(a);}
void build(int flag) {
sort(st.begin(),st.end());
tem.clear();
if(flag) {
//上凸壳
for(int i=0;i<st.size();i++) {
while(tem.size()>1&&slope(tem[tem.size()-2],tem[tem.size()-1])<slope(tem[tem.size()-1],st[i])+eps) tem.pop_back();
tem.push_back(st[i]);
}
} else {
//下凸壳
for(int i=0;i<st.size();i++) {
while(tem.size()>1&&slope(tem[tem.size()-2],tem[tem.size()-1])+eps>slope(tem[tem.size()-1],st[i])) tem.pop_back();
tem.push_back(st[i]);
}
}
st=tem;
}
ll query(point a) {
int l=0,r=st.size()-1;
while(r-l>=3) {
int lmid=(l+l+r)/3;
int rmid=(l+r+r)/3;
if(cdot(st[lmid],a)>cdot(st[rmid],a)) r=rmid;
else l=lmid;
}
double ans=-inf;
for(;l<=r;l++) ans=max(ans,cdot(st[l],a));
return (ll)ans;
}
};
struct tree {
int l,r;
Convex u,d;
}tr[N<<2];
void build(int v,int l,int r) {
tr[v].l=l,tr[v].r=r;
if(l==r) return ;
int mid=l+r>>1;
build(v<<1,l,mid),build(v<<1|1,mid+1,r);
}
void Insert(int v,int p,point a) {
tr[v].u.Insert(a);
tr[v].d.Insert(a);
if(tr[v].u.size()==tr[v].r-tr[v].l+1) {
tr[v].u.build(1);
tr[v].d.build(0);
}
if(tr[v].l==tr[v].r) return ;
int mid=tr[v].l+tr[v].r>>1;
if(p<=mid) Insert(v<<1,p,a);
else Insert(v<<1|1,p,a);
}
ll query(int v,int l,int r,point a) {
if(tr[v].l>r||tr[v].r<l) return -inf;
if(l<=tr[v].l&&tr[v].r<=r) return a.y>0?tr[v].u.query(a):tr[v].d.query(a);
return max(query(v<<1,l,r,a),query(v<<1|1,l,r,a));
}
int main() {
n=Get();
scanf("%c",&type);
build(1,1,n);
char op;
point a;
int l,r;
int now=0;
while(n--) {
while(op=getchar(),!isalpha(op));
if(op=='A') {
now++;
a.x=decode(Get()),a.y=decode(Get());
Insert(1,now,a);
} else {
a.x=decode(Get()),a.y=decode(Get());
l=decode(Get()),r=decode(Get());
cout<<(ans=query(1,l,r,a))<<"\n";
}
}
return 0;
}
【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| & ...
- 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 ...
随机推荐
- C# 插件热插拔
所谓热插拔就是插件可以 在主程序不重新启动的情况直接更新插件, 网上有很多方案: https://www.cnblogs.com/happyframework/p/3405811.html 如下: 但 ...
- c# partial 关键字的使用
C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文件中实现.(2) ...
- 使用Mybatis Generator插件自动生成映射文件(cmd无法进入文件,dns服务器对区域没有权威等问题)遇到问题
使用Mybatis Genertor插件自动生MyBatis所需要的DAO接口,实体模型类,Mapping映射文件,将生成的代码赋值到项目工程中即可. 有命令行,Eclipse插 ...
- Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因
1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...
- linux下ftp服务器搭建
1.yum install vsftpd 使用yum安装ftp 2.创建并授权ftp文件目录 mkdir -P /ftp/ftpadmin chmod -R 777 /ftp/ftp ...
- Get与Post的主要区别
这里附一篇自己的简短理解 get相对于post更不安全,虽然都可以加密 get的参数会显示在浏览器地址栏中,而post的参数不会显示在浏览器地址栏中: 使用post提交的页面在点击[刷新]按钮的时候浏 ...
- 06-HTML-表格标签
<html> <head> <title>表格标签学习</title> <meta charset="utf-8"/> ...
- windows for windows:下载、安装
关于docker的下载:同学们不要再网上找来找去了,直接去到阿里云下载客户端,配置阿里的国内镜像地址就好~ 申请一个阿里云的账号,然后: tips:如果使用虚拟机的os 是windows 那么很抱歉, ...
- [CSS] 点击事件触发的动画
源码 https://github.com/YouXianMing/CSS-Animations/tree/master/Event 效果 细节 1) 一个完整的可回溯的动画至少包括了两种状态,以及两 ...
- vivo怎么录屏 手机录制屏幕详细教程
在手机上我们经常可以刷到许多类似于手机游戏之类的屏幕视频我想肯定会有很多人好奇怎么录制的,今天小编所说的便是教大家如何在安卓手机上进行屏幕录像,下面便是关于vivo怎么录屏的具体操作方法,希望能对你们 ...