离线, 然后按时间分治, 每个向量都有出现时间[l, r], 直接插入时间线段树(一个向量只会影响O(logN)数量级的线段树节点). 在线段树每个节点弄出凸壳然后二分. 时间复杂度O(Nlog^2N)

---------------------------------------------------------------------------

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
typedef long long ll;
#define V(x) v[p[x]]
#define C(x) v[c[x]]
#define Q(x) q[_q[x]]
#define K(a, b) ((double) (a.y - b.y) / (a.x - b.x))
 
const int maxn = 200009;
 
int N, T, qn, vn, pn, cn;
int p[maxn], _q[maxn], c[maxn];
double lk[maxn], rk[maxn];
ll ans[maxn];
int buf[20];
 
inline int getint() {
char c = getchar();
for(; !isdigit(c); c = getchar());
int ret = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return ret;
}
 
inline void putint(ll x) {
if(!x) {
puts("0");
} else {
int n = 0;
for(; x; x /= 10) buf[n++] = x % 10;
while(n--) putchar(buf[n] + '0');
puts("");
}
}
 
struct Q {
int p, x, y;
} q[maxn];
 
struct V {
int x, y, l, r;
} v[maxn];
 
struct L {
int p;
L* nxt;
} Lpool[maxn * 50], *Lpt = Lpool;
 
inline void AddL(L*&t) {
Lpt->p = T;
Lpt->nxt = t;
t = Lpt++;
}
 
struct Node {
Node *lc, *rc;
L* v;
} pool[maxn << 1], *pt = pool, *Root;
 
void Modify(Node* t, int l, int r) {
if(v[T].l <= l && r <= v[T].r) {
AddL(t->v);
} else {
int m = (l + r) >> 1;
if(v[T].l <= m) Modify(t->lc, l, m);
if(m < v[T].r) Modify(t->rc, m + 1, r);
}
}
 
void Build(Node* t, int l, int r) {
if(l != r) {
int m = (l + r) >> 1;
Build(t->lc = pt++, l, m);
Build(t->rc = pt++, m + 1, r);
}
}
 
bool Cmp(const int &l, const int &r) {
return v[l].x < v[r].x || (v[l].x == v[r].x && v[l].y < v[r].y);
}
 
void Solve(Node* t, int l, int r) {
if(l != r) {
int m = (l + r) >> 1;
Solve(t->lc, l, m);
Solve(t->rc, m + 1, r);
}
pn = cn = 0;
for(L* o = t->v; o; o = o->nxt) p[pn++] = o->p;
if(!pn) return;
sort(p, p + pn, Cmp);
c[cn++] = p[0];
for(int i = 1; i < pn; i++) {
while(cn && V(i).x == C(cn - 1).x) cn--;
while(cn > 1 && K(V(i), C(cn - 1)) > K(C(cn - 1), C(cn - 2))) cn--;
c[cn++] = p[i];
}
lk[0] = 1e30, rk[cn - 1] = -1e30;
for(int i = 1; i < cn; i++)
lk[i] = rk[i - 1] = K(C(i), C(i - 1));
for(int i = l; i <= r; i++) if(~_q[i]) {
int _l = 0, _r = cn - 1;
double k = -1.0 * Q(i).x / Q(i).y;
while(_l <= _r) {
int m = (_l + _r) >> 1;
ans[_q[i]] = max(ans[_q[i]], ll(C(m).x) * Q(i).x + ll(C(m).y) * Q(i).y);
(k < lk[m] && k < rk[m]) ? _l = m + 1 : _r = m - 1;
}
}
}
 
void Work() {
Build(Root = pt++, 1, N);
for(T = 0; T < vn; T++) Modify(Root, 1, N);
pn = 0;
Solve(Root, 1, N);
for(int i = 0; i < qn; i++) putint(ans[i]);
}
 
void Init() {
N = getint();
qn = vn = 0;
memset(_q, -1, sizeof _q);
for(int i = 1; i <= N; i++) {
int t = getint();
if(t == 3) {
_q[i] = qn;
q[qn].x = getint(), q[qn].y = getint();
q[qn++].p = i;
} else if(t == 1) {
v[vn].x = getint(), v[vn].y = getint();
v[vn].l = i, v[vn++].r = N;
} else
v[getint() - 1].r = i;
}
memset(ans, 0, sizeof ans);
}
 
int main() {
Init();
Work();
return 0;
}

---------------------------------------------------------------------------

4311: 向量

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 58  Solved: 26
[Submit][Status][Discuss]

Description

你要维护一个向量集合,支持以下操作:
1.插入一个向量(x,y)
2.删除插入的第i个向量
3.查询当前集合与(x,y)点积的最大值是多少。如果当前是空集输出0

Input

第一行输入一个整数n,表示操作个数
接下来n行,每行先是一个整数t表示类型,如果t=1,输入向量
(x,y);如果t=2,输入id表示删除第id个向量;否则输入(x,y),查询
与向量(x,y)点积最大值是多少。
保证一个向量只会被删除一次,不会删没有插入过的向量

Output

对于每条t=3的询问,输出一个答案

Sample Input

5
1 3 3
1 1 4
3 3 3
2 1
3 3 3

Sample Output

18
15

HINT

n<=200000 1<=x,y<=10^6

Source

BZOJ 4311: 向量( 按时间分治 + 线段树 )的更多相关文章

  1. bzoj 4311 向量 时间线建线段树+凸包+三分

    题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致 ...

  2. [BZOJ1018][SHOI2008]堵塞的交通traffic 时间分治线段树

    题面 介绍一种比较慢的但是好想的做法. 网上漫天的线段树维护联通性,然后想起来费很大周折也很麻烦.我的做法也是要用线段树的,不过用法完全不同. 这个东西叫做时间分治线段树. 首先我们建一个\(1..m ...

  3. 2019ICPC上海网络赛A 边分治+线段树

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 解法:边分治+线段树 首先我们将所有的点修改和边修改都存在对应的边里面. 然后 ...

  4. UVALive 7148 LRIP【树分治+线段树】

    题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...

  5. 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树

    题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...

  6. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...

  7. 【bzoj4372】烁烁的游戏 动态点分治+线段树

    题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...

  8. 【bzoj3730】震波 动态点分治+线段树

    题目描述 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着时代的发展,城市 ...

  9. 洛谷T44252 线索_分治线段树_思维题

    分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...

随机推荐

  1. IOS 8弃用api

    IOS 8弃用api 下面api是弃用: 的 UIApplication 方法和属性注冊通知. 使用新的API. 的 uiviewcontroller 面向接口的方法和属性. 中描写叙述的特征和大小类 ...

  2. TCPDUMP详解(续)

    TCPdump抓包命令  tcpdump是一个用于截取网络分组,并输出分组内容的工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具.  tcp ...

  3. android handler机制和Timer采用

    Timer主要用于创建一个任务来定期运行. 创建继承Task该任务等级.即任务每次跑. private class MyTask extends TimerTask { @Override publi ...

  4. Swift应用开源项目推荐

    1. 风靡全球的2048 2014年出现了不少虐心的小游戏,除了名声大噪的Flappy Bird外,最风靡的应该就是2048了.一个看似简单的数字叠加游戏,却让玩的人根本停不下来,朋友圈还一度被晒分数 ...

  5. java代码如何快速添加作者描述的注释最好能有详细的图解

    MyEclipse 中自动插入作者.注释日期等de快捷键方法依次打开然后找到 Window -->Preferences->Java->Editor->Templates,在这 ...

  6. Struts2配置问题java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    方法一:右键点击项目--->build path-->configure build path-->左侧菜单栏就会看到Deployment Assembly-->右侧点击add ...

  7. iOS定位与地图

    定位: 手机上定位的实现主要有三种方式:基站(附近基站的位置),wifi(所连接路由器的位置),卫星(最准确,也最耗能). iOS的定位功能主要是由CLLocationManager类来完成的.这个类 ...

  8. 简单的表单验证(js、jquery)

    //javascript代码 function valForm(){ var username=document.getElementById("username"); var p ...

  9. php composer包管理工具

    一 . 包管理工具 你在Centos上装工具的时候直接yum -y install xx 比你去rpm -ivh xx.rpm 是不是爽很多呢? composer 就是安装php 代码的一个类似工具. ...

  10. jira 解决结果配置

    jira 的配置比较繁琐,有很多的小细节,使用中出现了各种小问题,总结梳理下 1.解决结果 问题1:编辑了任务后,解决结果变成了已解决 找到编辑任务所对应的界面方案,将解决结果字段从界面配置里移除 问 ...