答案一定是在凸壳上的(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. MySQL 查询结果以百分比显示

    找了一些资料,然后我是用到了MySQL字符串处理中的两个函数concat()和left()1.[CONCAT(str1,str2,...)  返回来自于参数连结的字符串.如果任何参数是 NULL, 返 ...

  2. Flash,一次Bug的思考

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

  3. [置顶] 编辑框Editext光标最后显示

    [MainActivity] package com.example.testeditext; import android.os.Bundle; import android.app.Activit ...

  4. [ACM] hdu 1003 Max Sum(最大子段和模型)

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. Visual Studio使用技巧

    编程部分: 1.TODO:书签 打开之后返回上次工作的位置.让我们不再用脑子去记忆,去回顾刚刚工作到的部分. 操作非常easy.例如以下代码所看到的: public DataTable SelectB ...

  6. win10安装数据库:[INS-13001]

    升级win10系统之后,需要重新安装Oracle,因为在安装Oralce11g时,使用64位的会出现各种不兼容问题,我每次安装都是使用32位的数据库. 在安装时点击setup.exe之后,出现了:[I ...

  7. 关于mysql使用dbForge调试的问题:Object 'test.p_insertRoute' does not exist.

    mysql中使用dbForge6.1版本调试存储过程,如果存储过程中定义的变量时枚举类型,那么就会报出该存储过程没有报出的错误,这个应该是dbForge6.1版本的bug

  8. python 32位、64位确定

    1.python 进入交互式命令行,如下: 2.执行以下命令: import struct;print struct.calcsize("P") * 8

  9. 将以管理员方式运行cmd运行方式放到win7任务栏

    首先在桌面空白地方(没有桌面图标位置),点击鼠标右键,选择新建--快捷方式,如下图:       弹出创建快捷方式窗口,输入cmd.exe的路径及文件名,下图是天缘的Windows 7安装到C盘对应的 ...

  10. Application Loader下载安装和上传IOS app程序

    如果您安装了最新版的XCode开发环境.对于在4.2及以上版本,Developer/Applications/Utilities目录中已经有ApplicationLoader程序,无需执行以下单独安装 ...