【SDOI2014】向量集

题目描述

我们分析一波:

假设我们询问\((A,B)\),\(x_i>x_j\)若

\[A\cdot x_i+B\cdot y_i>A\cdot x_j+B\cdot y_j\\
A\cdot(x_i-x_j)>B\cdot(y_j-y_i)
\]

当\(B>0\)

\[-\frac{A}{B}<\frac{y_i-y_j}{x_i-x_j}
\]

否则

\[-\frac{A}{B}>\frac{y_i-y_j}{x_i-x_j}
\]

所以,对于\(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】向量集的更多相关文章

  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. 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] nginx管理员指南基本功能

    1.运行时控制Nginx进程 NGINX有一个主进程和一个或多个工作进程. 如果启用了缓存,则缓存加载器和缓存管理器进程也会在启动时运行. 主进程的主要目的是读取和评估配置文件,以及维护工作进程. 工 ...

  2. D. GukiZ and Binary Operations(矩阵+二进制)

    D. GukiZ and Binary Operations   We all know that GukiZ often plays with arrays. Now he is thinking ...

  3. IP是什么 DNS 域名与IP有什么不同

    IP地址是在网络上分配给每台计算机或网络设备的32位数字标识.在Internet上,每台计算机或网络设备的IP地址是全世界唯一的.IP地址的格式是 xxx.xxx.xxx.xxx,其中xxx是 0 到 ...

  4. 价值1.35亿美元的BUG

    价值1.35亿美元的BUG 译者按: 一横值千金啊! 原文: Mariner 1’s $135 million software bug 译者: Fundebug 为了保证可读性,本文采用意译而非直译 ...

  5. [笔记]JavaScript 秘密花园

    1.hasOwnProperty相关 为了判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自 Object.prototype 的 hasOwnProperty方法.hasOwnP ...

  6. Flutter 动画详解(一)

    本文主要介绍了动画的原理相关概念,对其他平台的动画做了一个简要的梳理,并简要的介绍了Flutter动画的一些知识. 1. 动画介绍 动画对于App来说,非常的重要.很多App,正是因为有了动画,所以才 ...

  7. C#调用原生C++ COM对象(在C++中实现C#的接口)

    为了跨平台在.net core中使用COM,不能使用Windows下的COM注册机制,但是可以直接把IUnknown指针传给C#,转换为指针,再转换为C#的接口(interface). 做了这方面的研 ...

  8. 记CSS格式化上下文

    fomatting context 引言 主要讲解的是BFC上下文 本文是查看 史上最全面.最透彻的BFC原理剖析 的笔记 所以不会详解BFC, 只是记录学习心得, 以及重要规则避免原文失效 简介 F ...

  9. 编程经验点滴----巧妙解决 Oracle NClob 读写问题

    最近一个新项目中,尝试在 Oracle 数据库中使用 NCLOB 来保存大的 xml 字符串. 在代码自动生成工具(通过 JDBC 驱动程序,读数据库表结构,自动生成对应的 java 代码,包含增加. ...

  10. Python sax模块(SAX解析XML)

    XML样例: <?xml version="1.0"?> <collection shelf="New Arrivals"> <m ...