BZOJ4311 向量(线段树分治+三分)
由点积的几何意义(即投影)可以发现答案一定在凸壳上,并且投影的变化是一个单峰函数,可以三分。现在需要处理的只有删除操作,线段树分治即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 200010
#define ll long long
int n,m,t;
int L[N<<],R[N<<],size[N<<];
struct point
{
int x,y,s;
ll operator *(const point&a) const
{
return 1ll*x*a.x+1ll*y*a.y;
}
bool operator <(const point&a) const
{
return x<a.x;
}
}a[N],q[N];
bool check(point a,point b,point c)
{
return 1ll*(a.y-b.y)*(c.x-b.x)>1ll*(c.y-b.y)*(a.x-b.x);
}
vector<point> tree[N<<];
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;
if (l==r) return;
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
void ins(int k,int l,int r,point x)
{
if (L[k]==l&&R[k]==r) {tree[k].push_back(x);return;}
int mid=L[k]+R[k]>>;
if (r<=mid) ins(k<<,l,r,x);
else if (l>mid) ins(k<<|,l,r,x);
else ins(k<<,l,mid,x),ins(k<<|,mid+,r,x);
}
void make(int k)
{
sort(tree[k].begin(),tree[k].end());
int s=tree[k].size(),t=-;
for (int i=;i<s;i++)
{
while (t>=&&tree[k][i].y>tree[k][t].y) t--;
while (t>&&check(tree[k][t-],tree[k][t],tree[k][i])) t--;
tree[k][++t]=tree[k][i];
}
size[k]=t;
if (L[k]==R[k]) return;
make(k<<),make(k<<|);
}
ll calc(int k,point x)
{
if (size[k]==-) return ;
int l=,r=size[k];
while (l+<r)
{
int mid1=l+(r-l)/,mid2=r-(r-l)/;
if (x*tree[k][mid1]>x*tree[k][mid2]) r=mid2;
else l=mid1;
}
ll ans=;
for (int i=l;i<=r;i++) ans=max(ans,x*tree[k][i]);
return ans;
}
ll query(int k,int p,point x)
{
ll t=calc(k,x);
if (L[k]==R[k]) return t;
int mid=L[k]+R[k]>>;
if (p<=mid) return max(t,query(k<<,p,x));
else return max(t,query(k<<|,p,x));
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4311.in","r",stdin);
freopen("bzoj4311.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
build(,,n);
for (int i=;i<=n;i++)
{
int op=read();
if (op==) t++,a[t].x=read(),a[t].y=read(),a[t].s=i;
else if (op==) m++,q[m].x=read(),q[m].y=read(),q[m].s=i;
else
{
int x=read();
ins(,a[x].s,i,a[x]);
a[x].x=a[x].y=;
}
}
for (int i=;i<=t;i++)
if (a[i].x) ins(,a[i].s,n,a[i]);
make();
for (int i=;i<=m;i++) printf(LL,query(,q[i].s,q[i]));
return ;
}
BZOJ4311 向量(线段树分治+三分)的更多相关文章
- [BZOJ4311]向量(凸包+三分+线段树分治)
可以发现答案一定在所有向量终点形成的上凸壳上,于是在上凸壳上三分即可. 对于删除操作,相当于每个向量有一个作用区间,线段树分治即可.$O(n\log^2 n)$ 同时可以发现,当询问按斜率排序后,每个 ...
- 【BZOJ4311】向量(线段树分治,斜率优化)
[BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...
- bzoj4311向量(线段树分治+斜率优化)
第二道线段树分治. 首先设当前向量是(x,y),剩余有两个不同的向量(u1,v1)(u2,v2),假设u1>u2,则移项可得,若(u1,v1)优于(u2,v2),则-x/y>(v1-v2) ...
- 2019.02.26 bzoj4311: 向量(线段树分治+凸包)
传送门 题意: 支持插入一个向量,删去某一个现有的向量,查询现有的所有向量与给出的一个向量的点积的最大值. 思路: 考虑线段树分治. 先对于每个向量处理出其有效时间放到线段树上面,然后考虑查询:对于两 ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
随机推荐
- python一个小程序:猜数字
猜数字游戏程序运行示例: I am thinking of a number between 1 and 20. Take a guess. 8 Your guess is too low. Take ...
- pyqt5通过qt designer 设计方式连接多个UI图形界面
当我们通过pyqt开发时,eric6为我们提供了一个方便的工具:图形化的绘制UI工具--qtdesigner.我们可以通过它开发多个UI,然后利用信号-槽工具,将功能代码附着在上面.也可以将多个界面连 ...
- Yaf学习(一)----Linux安装Yaf
1.简介 Yaf,全称 Yet Another Framework,是一个高性能的PHP开发框架,采用PHP扩展实现(c语言).Blablablabla....... 2.环境 2.1 虚拟机 虚拟机 ...
- Centos安装docker#避免很多坑
采用yum方式安装 安装: step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 Step 2 ...
- 谭浩强第四版第九章课后习题12>>>建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,若链表 中的结点所包含的年龄等于此年龄,则删除此结点。
#include<stdio.h> #include<stdlib.h> #define N sizeof(link) typedef struct lin { struct ...
- Plsql developer 怎么在打开时登陆配置oracel client?
配置前 logon 这块是空白的,该怎么配置呢? 看下面 --> 安装完plsql 后 需要安装 oracle client, 这里不再赘述,请自行百度.下面将贴出如何使用 oracle cli ...
- 深度学习:激活函数的比较和优缺点,sigmoid,tanh,relu
https://blog.csdn.net/u011684265/article/details/78039280
- windows下oracle 11g r2 安装过程与卸载详细图解
Oracle 11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装 . 2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是' 3.下图后,选择创建和配置数 ...
- 转:C#微信公众号开发之接收事件推送与消息排重的方法
本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...
- leetcode笔记--3 Niim game
question: You are playing the following Nim Game with your friend: There is a heap of stones on the ...