答案一定是在凸壳上的(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. 【插队问题-线段树-思维巧妙】【poj2828】Buy Tickets

    可耻的看了题解 巧妙的思维 逆序插入,pos 代表的意义为前面要有pos个空格才OK: 证明:仔细思考一下就觉得是正确的,但是要想到这种方式还是要很聪明,空格是前面的几个数字所形成的,所以要特地留出来 ...

  2. asp.net 网站所有请求跳转到同一个页面

    应用场景:网站维护和未开发完成时,一般需要把所有请求都跳转的一个相关说明的页面,这样用户不至于困惑这个网站是不存在还是怎么了. Solution1:使用一个名称为 app_offline.htm(名字 ...

  3. javascript 全选与反选

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  4. 监控concurrent 正在执行的sql

    SELECT a.sid, a.serial#, b.sql_text   FROM v$session a, v$sqltext b WHERE a.sql_address = b.address  ...

  5. 20151225--easyUI

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. google base之IncomingTaskQueue

    如同名称描述的那样,这个类就是个taskqueue,也就是任务队列,添加任务到队列,然后由MessageLoop去执行task,比较关心的函数如下: bool IncomingTaskQueue::A ...

  7. [转载]给10万pv的WordPress选择最便宜高可用的硬件以及WordPress高并发支持

    这些命令很长,但是希望可以让你很容易按照步骤创建一个全新的Linux服务器,使用Varnish, Nginx, W3 Total Cache, and WordPress来搭建一个WordPress博 ...

  8. acdream 1157Segments cdq分治

    题目链接 #include <iostream> #include <vector> #include <cstdio> #include <cstring& ...

  9. 从零开始学 iOS 开发的15条建议

    事情困难是事实,再困难的事还是要每天努力去做是更大的事实. 因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发.跟粉丝群的朋友交 ...

  10. 在 Windows Azure 虚拟机中如何备份和还原 Windows 系统磁盘

    备份和还原对于操作真实的系统来说至关重要.对于 Windows Azure 虚拟机环境中的 Windows Server,可以根据自身的需求选择多种不同的工具或将这些工具结合使用来实现备份.下面将对这 ...