答案一定是在凸壳上的(y>0上凸壳, y<0下凸壳). 线段树维护, 至多N次询问, 每次询问影响O(logN)数量级的线段树结点, 每个结点O(logN)暴力建凸壳, 然后O(logN)三分(二分也是可以的, 不过三分好写, 而且没精度问题....), O(Nlog^2N), 可以AC。

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

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
typedef long long ll;
#define Decode(x) (x ^= (ans & 0X7FFFFFFF))
 
const int maxn = 400009;
 
bool Online;
int n, N, L, R, pos;
ll ans;
 
inline void Max(ll &x, ll t) {
if(t > x) x = t;
}
 
inline int getint() {
char c = getchar();
int ret = 0, f = 1;
for(; !isdigit(c); c = getchar())
if(c == '-') f = 0;
for(; isdigit(c); c = getchar())
ret = ret * 10 + c - '0';
return f ? ret : -ret;
}
 
struct P {
int x, y;
bool operator < (const P &o) const {
return x < o.x;
}
ll operator * (const P &o) const {
return ll(x) * o.x + ll(y) * o.y;
}
} p[maxn], o[maxn], seq[4000000], q;
 
struct Node {
Node *lc, *rc;
int l[2], r[2], t;
} pool[maxn << 1], *pt = pool, *Root;
 
void Build(Node* t, int l, int r) {
t->t = 0;
if(l != r) {
int m = (l + r) >> 1;
Build(t->lc = pt++, l, m);
Build(t->rc = pt++, m + 1, r);
}
}
 
inline bool chk(P &a, P &b, P &c, int t) {
int e = a.y - b.y, f = a.x - b.x, g = b.y - c.y, h = b.x - c.x;
if(h < 0) t ^= 1;
if(f < 0) t ^= 1;
return t ? ll(e) * h >= ll(f) * g : ll(e) * h <= ll(f) * g;
}
 
void ConvexHull(Node* t, int l, int r, int v) {
int len = 0, &Left = t->l[v];
for(int i = l; i <= r; i++) o[len++] = p[i];
sort(o, o + len);
seq[Left = pos] = o[0];
for(int i = 1; i < len; i++) {
if(seq[pos].x == o[i].x) {
if(!v && seq[pos].y >= o[i].y) continue;
if(v && seq[pos].y <= o[i].y) continue;
pos--;
}
while(pos > Left && chk(seq[pos - 1], seq[pos], o[i], v))
pos--;
seq[++pos] = o[i];
}
t->r[v] = pos++;
}
 
void Query(Node* t, int l, int r) {
if(L <= l && r <= R) {
if(!t->t) {
ConvexHull(t, l, r, 0);
ConvexHull(t, l, r, 1);
t->t = 1;
}
int Left = t->l[q.y < 0], Right = t->r[q.y < 0];
if(!q.y) {
Max(ans, max(seq[Left] * q, seq[Right] * q));
return;
}
while(Left <= Right) {
int d = (Right - Left) / 3, m1 = Left + d, m2 = Right - d;
Max(ans, max(seq[m1] * q, seq[m2] * q));
if(seq[m1] * q < seq[m2] * q) {
Left = m1 + 1;
} else
Right = m2 - 1;
}
} else {
int m = (l + r) >> 1;
if(L <= m) Query(t->lc, l, m);
if(m < R) Query(t->rc, m + 1, r);
}
}
 
void Init() {
N = getint();
char c;
scanf(" %c", &c);
Online = (c != 'E');
Build(Root = pt++, 1, N);
}
 
void Work() {
char c;
n = pos = 0, ans = 0;
for(int i = 0; i < N; i++) {
scanf(" %c", &c);
if(c != 'A') {
q.x = getint(), q.y = getint();
L = getint(), R = getint();
if(Online) {
Decode(q.x), Decode(q.y);
Decode(L), Decode(R);
}
ans = -1LL << 60;
Query(Root, 1, N);
printf("%lld\n", ans);
} else {
++n;
p[n].x = getint(), p[n].y = getint();
if(Online)
Decode(p[n].x), Decode(p[n].y);
}
}
}
 
int main() {
Init();
Work();
return 0;
}

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

3533: [Sdoi2014]向量集

Time Limit: 25 Sec  Memory Limit: 512 MB
Submit: 495  Solved: 164
[Submit][Status][Discuss]

Description

维护一个向量集合,在线支持以下操作:
"A x y (|x|,|y| < =10^8)":加入向量(x,y);
" Q x y l r (|x|,|y| < =10^8,1 < =L < =R < =T,其中T为已经加入的向量个数)询问第L个到第R个加入的向量与向量(x,y)的点积的最大值。
    集合初始时为空。

Input

输入的第一行包含整数N和字符s,分别表示操作数和数据类别;
    接下来N行,每行一个操作,格式如上所述。
    请注意s≠'E'时,输入中的所有整数都经过了加密。你可以使用以下程序
得到原始输入:
inline int decode (int x long long lastans) {
     return x ^ (lastans & Ox7fffffff);
}
function decode
begin
    其中x为程序读入的数,lastans为之前最后一次询问的答案。在第一次询问之前,lastans=0。

注:向量(x,y)和(z,W)的点积定义为xz+yw。

Output

对每个Q操作,输出一个整数表示答案。

Sample Input

6 A
A 3 2
Q 1 5 1 1
A 15 14
A 12 9
Q 12 8 12 15
Q 21 18 19 18

Sample Output

13
17
17

解释:解密之后的输入为
6 E
A 3 2
Q 1 5 1 1
A 2 3
A 1 4
Q 1 5 1 2
Q 4 3 2 3

HINT

1 < =N < =4×10^5

新加数据一组..2015.315

Source

BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )的更多相关文章

  1. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

  2. bzoj 3533: [Sdoi2014]向量集 线段树维护凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...

  3. BZOJ3533:[SDOI2014]向量集(线段树,三分,凸包)

    Description 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); " Q x y l r (| ...

  4. 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包

    题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...

  5. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  6. [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]

    题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...

  7. 【BZOJ】4311: 向量(线段树分治板子题)

    题解 我们可以根据点积的定义,垂直于原点到给定点构成的直线作一条直线,从正无穷往下平移,第一个碰到的点就是答案 像什么,上凸壳哇 可是--动态维护上凸壳? 我们可以离线,计算每个点能造成贡献的一个询问 ...

  8. 【BZOJ4311】向量(线段树分治,斜率优化)

    [BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...

  9. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

随机推荐

  1. Flash,一次Bug的思考

    我绝对不算是F黑,大部分时候,我还是很挺Flash平台的,Flash提供了很好的跨平台特性以及Flash Player11后的GPU加速.Stage3D等等,对于开发者来说,绝对让人欣喜若狂(对我是这 ...

  2. cocos2D(九)---- CCAction

    之前介绍CCNode的时候说过,动作是指在特定时间内完毕移动.缩放.旋转等操作的行为,节点能够通过执行动作来实现动画效果,这里的动作就是指CCAction对象,它有非常多的子类,每一个子类都封装了不同 ...

  3. sctf pwn300

    拿到程序后,拉入IDA,大概看了一番后,尝试运行,进一步了解程序的功能. 发现NX enabled,No PIE. 一号是一个猜数字的游戏,二号是一个留言本,三号是打印出留言的内容,四号是退出. 观察 ...

  4. html系列教程--span style 及表格标签 title video

    <span> 标签:非块状元素,用于文本描述 <style> 标签:内联样式表标签定义样式信息,必须写明type类型为text/css,建议写在head中,不是必须 demo: ...

  5. bootstrap注意事项(七)图片

    在本章中,我们将学习 Bootstrap 对图片的支持.Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图 ...

  6. SQL初级阶段笔记

    DataBase Management Stystem(数据库管理系统)简称:DBSM:虽然DBSM并不等于数据库,但行业内通常将DBSM称为数据库,所以一般来说数据库就指的是DBSM. 简单来讲DB ...

  7. mysql-5.7.10-winx64 MySQL服务无法启动,服务没有报告任何错误的解决办法

      总结报错原因:在my.init文件下新增data目录(datadir = F:\mysqldata ) 最新解压版本的mysql 解压安装的时候报错D:\mysql\mysql-5.7.10-wi ...

  8. jQuery EasyUI combobox多选和赋值

    定义select <select id="ID" name=empVO.acunid class="easyui-combobox" required=& ...

  9. Python核心编程读笔 13:执行环境

    第14章  执行环境 一.可调用对象 python有四种可调用对象:函数.方法.类.一些类的实例 1 函数 (1)内建函数(BIF) BIF是用c/c++写的,编译后放入python解释器,然后把它们 ...

  10. 分析JavaScript代码应该放在HTML代码哪个位置比较好

    本文总结了多种放置JS代码的方法,需要的朋友可以参考下 在哪里放置 JavaScript 代码? 通常情况下,JavaScript 代码是和 HTML 代码一起使用的,可以将 JavaScript 代 ...