【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. WPF TextBlock IsTextTrimmed 判断文本是否超出

    WPF TextBlock/TextBox 设置TextTrimming情况下 判断 isTextTrimmed(Text 文本是否超出 是否出现了省略号) private bool IsTextTr ...

  2. [PHP] 多进程通信-消息队列使用

    向消息队列发送数据和获取数据的测试 <?php $key=ftok(__FILE__,'a'); //获取消息队列 $queue=msg_get_queue($key,0666); //发送消息 ...

  3. 29.C++- 异常处理

    C++内置了异常处理的语法元素 try catch try语句处理正常代码逻辑 当try语句发现异常时,则通过throw语句抛出异常,并退出try语句 catch语句处理异常情况 当throw语句抛出 ...

  4. 8. 同步锁Lock

    package com.gf.demo07; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Ree ...

  5. O(n*logn)级别的算法之一(归并排序及其优化)

    原理: 设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 temp (相当于输出序列) ...

  6. angular ng-repeat出来的数据 每条修改数据后返回给接口 如何取到每个对应修改的值

    接口结构 $scope.DataList = [ { "dataA":"numA", "dataB":"numB"a } ...

  7. echarts功能配置实例----柱/折线、饼图

    ---恢复内容开始--- echarts中的柱状图和折线图的参数配置可以共用,一般只需要修改图表类型这一个参数即可. 一.echarts最简单的实例 1.折线图/柱状图 <html> &l ...

  8. CNN中,1X1卷积核到底有什么作用呢?

    CNN中,1X1卷积核到底有什么作用呢? https://www.jianshu.com/p/ba51f8c6e348 Question: 从NIN 到Googlenet mrsa net 都是用了这 ...

  9. JavaScript面向对象编程指南(三) 函数

    第3章 函数 3.1 什么是函数 函数:本质是一种代码的分组形式.函数的声明如下: <script type="text/javascript"> /*函数的声明组成: ...

  10. Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏

    大家会发现一个空项目,从手机桌面打开app是秒启动.但是对于自己开发的项目,有时会发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面. 个人理解为我们自己实现的Appli ...