答案一定是在凸壳上的(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. Win7 扩容磁盘分区

    1.计算机->管理->磁盘管理,磁盘颜色代表意义 主分区:深蓝色: 扩展分区 :绿色的框: 逻辑分区:浅蓝色的分区: 可用空间:绿色分区 2.非主分区扩容 非主分区扩容十分简单,可是须要注 ...

  2. SQL整理4

    --====================简单增删改===========--查看学生表的全部数据select * from studio   --插入一个新的学生信息insert into stu ...

  3. NET 人民币大写

    /***** HongShijin** Me@HongShijin.com** 2009-3-15 10:13:00.00000** text/C#***/ /// <summary> / ...

  4. SQL游标+递归查询客户子客户转换率

    ALTER PROCEDURE [dbo].[Account3YearsConversion ] as DECLARE @AccountId UNIQUEIDENTIFIER , @yearbefor ...

  5. Neo4j简介

    Neo4j简介 发表于2013年3月16日 11:52 p.m.    位于分类图数据库与图并行计算 现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS ...

  6. Properties文件的XML格式(转)

    想必大家都用过*.properties文件,作为配置文件.但是,如果该文件写入了中文,待编译后内容就会成为乱码,使用native命令也好.使用ant执行编码转换也好,多少有点麻烦,与其如此,我们不如直 ...

  7. 自己配置的WAMP环境,扩展oracle函数库(oci)

    同事昨天接到一个任务,要用php处理oracle数据库的内容,但是php打开oracle扩展不是像mysql那样直接用就行,需要下一点东西才能打开 第一步 需要到oracle官方下载一个install ...

  8. java通过JNI接口调用C语言-初级

    JNI(java native interface):即java本地调用C的接口. 先看整体运行: 下面是过程: #vim test.java public class test{ public na ...

  9. 《转》JAVA中PriorityQueue优先级队列使用方法

    该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最 ...

  10. 适配器模式—STL中的适配器模式分析

    适配器模式通常用于将一个类的接口转换为客户需要的另外一个接口,通过使用Adapter模式能够使得原本接口不兼容而不能一起工作的类可以一起工作. 这里将通过分析c++的标准模板库(STL)中的适配器来学 ...