在平面上进行三种操作:

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;
}

转载于:https://www.cnblogs.com/dyllove98/p/3228530.html

CF 19D Points 【线段树+平衡树】相关推荐

  1. P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    题目描述 如题,你需要维护这样的一个长度为 N  的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一 ...

  2. cf 786 B 线段树优化建图

    cf 786 B 链接 CF 思路 n个点,3种建边方式,规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊,说好的v,u变成了u,v. 两棵树,一棵出,一棵入.线段树的作用只不过是按照 ...

  3. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  4. [NOIp2017 Day2 T3] 列队phalanx(线段树 / 平衡树)

    题目 描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×mn×mn \times m名学生,方 ...

  5. 线段树分治 ---- F. Extending Set of Points(线段树分治 + 可撤销并查集)

    题目链接 题目大意: 你有个点集合SSS,每次往集合里面加点或者删点(如果要加的点出现过),如果(x1,y1),(x2,y1),(x1,y2),(x2,y2)(x1,y1),(x2,y1),(x1,y ...

  6. LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)

    代码 //可持久化线段树 #include <cstdio> using namespace std;struct node {node *Lnode,*Rnode;int val;voi ...

  7. CodeForces - 1311F Moving Points(线段树+离散化)

    题目链接:点击查看 题目大意:给出 x 轴上的 n 个点,每个点都有一个位置和一个速度,每个点会根据速度在 x 轴上移动,现在规定dis( x , y )为点 x 和点 y 在移动过程中的最小距离,我 ...

  8. BZOJ1058 ZJOI2007 报表统计 线段树+平衡树

    题意:给定一个序列,维护:1.插入一个元素  2.求相邻两个元素中,差值绝对值的最小值  3.求序列排序后相邻两个元素中,差值绝对值的最小值 题解: MIN_GAP:如果我们把数看成一组一组,每次插入 ...

  9. P3919 【模板】可持久化数组(可持久化线段树/平衡树)(入门第一题)

    学习博客:http://www.cnblogs.com/flashhu/p/8297581.html 题目链接:https://www.luogu.org/problemnew/show/P3919 ...

最新文章

  1. linux源码包卸载方式
  2. Spring3基于注释驱动的AOP
  3. eureka多台注册中心_spring cloud注册中心之Eureka
  4. 基于倒谱法、自相关法、短时幅度差法的基音频率估计算法(MATLAB及验证)
  5. 手把手教你Chrome浏览器安装Postman(含下载云盘链接)【转载】
  6. Copy List with Random Pointer
  7. (已解决)登录火狐浏览器账号后没有同步数据--博主的奇妙寻号之旅
  8. java object... arguments_Java面试之基础题---对象Object
  9. 实战篇:如何建设企业的营销管理和分析平台
  10. LeetCode Factorial Trailing Zeroes (阶乘后缀零)
  11. vscode设置中文流程
  12. 七本前端(javascript、css)最著名工具书免费下载
  13. 用Python分析了我的微信好友,原来我身边都是这样的人……绝了
  14. ear的英语怎么念_ears用英语怎么读?
  15. 关于Dell r720重装系统时遇到的识别不到磁盘的问题
  16. 熊厂远程办公!聊一聊我在家办公的真实体验!
  17. 电子元器件封装获取方法
  18. Library projects cannot set applicationId问题解决
  19. Altium Designer 21 原理图库元件模型的组成介绍以及简单的电阻电容元件模型的创建
  20. 简单制作一个网页需要注意的

热门文章

  1. THU – team project final review score
  2. 高才生的好帮手-Word2010(3)
  3. linq学习笔记(2):DataContext
  4. XmlReader and XmlWriter in .NET
  5. 潭州课堂25班:Ph201805201 django 项目 第三十三课 后台文章标签查询提交到前台,删除功能实现(课堂笔记)...
  6. Selenium Python 解决 UnexpectedAlertPresentException
  7. javascript初学
  8. 新手谈谈网站交互设计
  9. Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet)
  10. observeOn()与subscribeOn()的详解