CF 19D Points 【线段树+平衡树】
在平面上进行三种操作:
1、add x y:在平面上添加一个点(x,y)
2、remove x y:将平面上的点(x,y)删除
3、find x y:在平面上寻找一个点,使这个点的横坐标大于x,纵坐标大于y,而且要求他的横坐标尽量小,如果有多个点满足,则选取横坐标尽量小的前提下,纵坐标最小的点。
方法:
将横坐标x离散化,每一个坐标x对应的y用一颗平衡树维护(C++中的set),则这颗平衡树支持增加和删除以及查找比y大的最小值的操作。
在此基础上,对于每一个询问,只需要遍历大于x的set,并且找到最小的y即可。但是这样子依次向后遍历的复杂度为O(N)的,所以要用一颗线段树来维护横坐标区间段里面y的最大值,这样就可以在O(logN)的复杂度内找到最接近x的横坐标(而且满足当前坐标的最大纵坐标大于y),然后再set里面查找最小的纵坐标即可。
#include <cstdio>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 200100
int n, m, A[N], my[N<<2];
set<int> a[N];
char s[10]; struct node {
char op;
int x, y;
} q[N]; int idx(int v) {
return lower_bound(A, A+m, v) - A + 1;
} void update(int x, int L, int R, int rt) {
if (L == R) {
if (a[x].size() == 0) my[rt] = 0;
else my[rt] = *a[x].rbegin();
return ;
}
int Mid = (L + R) >> 1;
if (x <= Mid) update(x, L, Mid, rt<<1);
else update(x, Mid+1, R, rt<<1|1);
my[rt] = max(my[rt<<1], my[rt<<1|1]);
}
int query(int x, int y, int L, int R, int rt) {
if (L == R) {
if (my[rt] > y && x < L) return L;
return 0;
} int Mid = (L + R) >> 1;
int t = 0;
if (x < Mid && my[rt<<1] > y) t = query(x, y, L, Mid, rt<<1);
if (t == 0 && my[rt<<1|1] > y) t = query(x, y, Mid+1, R, rt<<1|1);
return t;
}
int main() {
scanf("%d", &n);
m = 0;
for (int i=0; i<n; i++) {
scanf(" %s%d%d", s, &q[i].x, &q[i].y);
q[i].op = s[0];
A[m++] = q[i].x;
a[i].clear();
}
a[n].clear(); sort(A, A+m);
m = unique(A, A+m) - A; memset(my, 0, sizeof(my));
int x, y;
for (int i=0; i<n; i++) {
x = idx(q[i].x), y = q[i].y; if (q[i].op == 'a') {
a[x].insert(y);
update(x, 1, n, 1);
} else if (q[i].op == 'r') {
a[x].erase(y);
update(x, 1, n, 1);
} else {
int t = query(x, y, 1, n, 1);
if (t) printf("%d %d\n", A[t-1], *a[t].upper_bound(y));
else puts("-1");
}
} return 0;
}
CF 19D Points 【线段树+平衡树】的更多相关文章
- CF 19D - Points 线段树套平衡树
题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...
- CodeForces 19D Points (线段树+set)
D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- Codeforces Beta Round #19D(Points)线段树
D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)
题面:[模板]可持久化数组(可持久化线段树/平衡树) 不知道说啥,总之我挺喜欢自己打的板子的! #include<cstdio> #include<cstring> #incl ...
- 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 870 Solved: 299[Submit] ...
- Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)
Extending Set of Points 我们能发现, 如果把x轴y轴看成点, 那么答案就是在各个连通块里面的x轴的个数乘以y轴的个数之和. 然后就变成了一个并查集的问题, 但是这个题目里面有撤 ...
随机推荐
- 在winform中调用js文件并输出结果
在winform中调用js文件并输出结果默认分类 2007-10-19 16:35:06 阅读25 评论0 字号:大中小 由于项目需要在winform中调一个强大的js,所以把这个tip记录在此: 1 ...
- java 全角、半角字符串转换
转自:http://www.cnblogs.com/modou/articles/2679815.html 加入了空字符串的验证 半角转全角的方法: /** * @Title: ToSBC * ...
- 30多条mysql数据库优化方法【转】
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Redis 中的事务
Redis支持简单的事务 Redis与mysql事务的对比 Mysql Redis 开启 start transaction muitl 语句 普通sql 普通命令 失败 rollback 回滚 di ...
- ASP.NET MVC轻教程 Step By Step 2 ——View初探
在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...
- Web.config总结
%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG目录下machine.config定义了针对当前机器的WinForm程序和asp.net应用程序的配 ...
- BZOJ 3240 矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的\(n\)行\(m\)列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用\(F[i][j]\)来 ...
- [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】
题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...
- 0x80072f8a未指定的错误
问题: 安装DotNetCore.1.0.1-VS2015Tools.Preview2.0.2.exe提示:0x80072f8a未指定的错误 解决方法: 修改IE选项,取消选项 “检查服务器证书是否已 ...
- java学习之变量
看完了常量,那我们来看下变量. 变量顾名思义,也就是能变化的量,也就是说已经定义之后它的值仍然是可以变的,不像常量一经定义便不能够改变了.比如说现在我们需要一个数,需要用户输入之后才能,确定这个数是几 ...