题目链接:http://codeforces.com/contest/19/problem/D

题意:给出3种操作:1)添加点(x,y),2)删除点(x,y),3)查询离(x,y)最近的右上方的点。

且满足添加的点不重复,删除的点一定存在。

题解:只要以x建树,记录下每个结点最大的y值。每次都更新一下。用线段树查找满足条件的最小的x,然后用一个set[x]来存x点下的y点。

然后用二分查找满足条件的最小的y。

#include <iostream>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int M = 2e5 + 10;
struct T_T {
char cp[10];
int x , y;
}num[M];
struct TnT {
int l , r , max_y;
}T[M << 2];
set<int>se[M];
set<int>::iterator it;
int a[M] , b[M] , c[M] , d[M];
void build(int l , int r , int p) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r , T[p].max_y = -1;
if(T[p].l == T[p].r) {
return;
}
build(l , mid , p << 1);
build(mid + 1 , r , (p << 1) | 1);
T[p].max_y = max(T[p << 1].max_y , T[(p << 1) | 1].max_y);
}
void updata(int p , int pos) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == T[p].r && T[p].l == pos) {
if(se[T[p].l].size()) {
it = (--se[T[p].l].end());
T[p].max_y = *it;
}
else {
T[p].max_y = -1;
}
return ;
}
if(mid >= pos) {
updata(p << 1 , pos);
}
else {
updata((p << 1) | 1 , pos);
}
T[p].max_y = max(T[p << 1].max_y , T[(p << 1) | 1].max_y);
}
int query(int p , int x , int y) {
if(T[p].r <= x) {
return -1;
}
if(T[p].max_y <= y) {
return -1;
}
if(T[p].l == T[p].r) {
return T[p].r;
}
int t = query(p << 1 , x , y);
if(t == -1)
return query((p << 1) | 1 , x , y);
return t;
}
int main() {
int n;
scanf("%d" , &n);
int count = 0;
for(int i = 0 ; i < n ; i++) {
scanf("%s %d %d" , num[i].cp , &num[i].x , &num[i].y);
if(num[i].cp[0] == 'a') {
a[count++] = num[i].x;
}
}
sort(a , a + count);
int cnt = 0;
a[count] = -1;
for(int i = 0 ; i < count ; i++) {
if(a[i] != a[i + 1]) {
b[cnt++] = a[i];
}
}
build(1 , M , 1);
for(int i = 0 ; i < n ; i++) {
if(num[i].cp[0] == 'a') {
int pos = upper_bound(b , b + cnt , num[i].x) - b;
se[pos].insert(num[i].y);
updata(1 , pos);
}
if(num[i].cp[0] == 'r') {
int pos = upper_bound(b , b + cnt , num[i].x) - b;
se[pos].erase(num[i].y);
updata(1 , pos);
}
if(num[i].cp[0] == 'f') {
int pos = upper_bound(b , b + cnt , num[i].x) - b;
int poss = query(1 , pos , num[i].y);
if(poss != -1) {
printf("%d %d\n" , b[poss - 1] , *se[poss].upper_bound(num[i].y));
}
else {
printf("-1\n");
}
}
}
return 0;
}

codeforces 19 D. Points(线段树+set二分)的更多相关文章

  1. Buses and People CodeForces 160E 三维偏序+线段树

    Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...

  2. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  3. 【BZOJ4552】排序(线段树,二分答案)

    [BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...

  4. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  5. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  6. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

  7. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

  8. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  9. Codeforces 431E Chemistry Experiment 线段树 + 二分

    Chemistry Experiment 维护一个权值线段树,然后二分答案. #include<bits/stdc++.h> #define LL long long #define LD ...

随机推荐

  1. codeforces 327 B. Hungry Sequence

    题目链接 题目就是让你输出n个数的序列,要保证该序列是递增的,并且第i个数的前面不能保护它的约数,我直接先对前100000的素数打表,然后输出前n个,so easy. //cf 191 B #incl ...

  2. codeforces 327 A Ciel and Dancing

    题目链接 给你一串只有0和1的数字,然后对某一区间的数翻转1次(0变1 1变0),只翻转一次而且不能不翻转,然后让你计算最多可能出现多少个1. 这里要注意很多细节 比如全为1,要求必须翻转,这时候我们 ...

  3. 为什么for循环可以遍历list:Python中迭代器与生成器

    1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...

  4. MOCTF-WEB-writeup

    MOCTF-WEB-writeup 好菜,除了简单的几个题,自己会做,难的都是看老大WP完成的,太菜了 啥姿势都不会,就此记录一下,供日后查看及反省.菜鸡的自我修养 0x01 一道水题 题目链接:ht ...

  5. Java集合系列(一)List集合

    List的几种实现的区别与联系 List主要有ArrayList.LinkedList与Vector几种实现. ArrayList底层数据结构是数组, 增删慢.查询快; 线程不安全, 效率高; 不可以 ...

  6. vmware15pro安装ubuntu18.10时出现显示不全问题

    如果这个时候用网上的ALT+左键拖拽根本没有效果 所以这里提供另外一种方式 就是正常安装的时候发现分区部分显示不全 此时点击右上角的橙色小×:询问是否退出 我们点击退出:之后就会来到试用界面 到了这里 ...

  7. .net持续集成测试篇之Nunit that断言

    系列目录 that是Nunit的新语法,语义上不如简单断言,使用上也更加复杂,但是其功能更加强大. 其基本语法如下代码片段示: [Test] public void DemoTest() { bool ...

  8. excel 导入 下载模板 demo

    import org.apache.commons.beanutils.PropertyUtils;import org.apache.commons.lang3.StringUtils;import ...

  9. Linux服务部署Yapi项目(安装Node Mongdb Git Nginx等)

    Linux服务部署Yapi 一,介绍与需求 1,我的安装环境:CentOS7+Node10.13.0+MongoDB4.0.10. 2,首先安装wget,用于下载node等其他工具 yum insta ...

  10. OSI七层网络模型与TCP/IP四层模型

    1.OSI七层结构图: 2.TCP/IP四层结构图: 3.各层对应的协议 4.OSI七层和TCP/IP四层的区别 OSI网络模型和TCP/IP网络模型对应关系: 5.交换机工作在OSI的哪一层 如果有 ...