题目链接: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 347A - Difference Row

    给你一个序列,让你求(x1 - x2) + (x2 - x3) + ... + (xn - 1 - xn).值最大的一个序列,我们化简一下公式就会发现(x1 - x2) + (x2 - x3) + . ...

  2. C# Winfrom 自定义控件——带图片的TextBox

    效果: 描述: 本来是想用GDI在左边画图片上去的,文本是居中对齐,如果文本是左对齐,文本会把图片遮住控件长这样: 但这样做,输入框在获取焦点时候,会把图片挡住就像这样: 输入完成之后图片就会显示完整 ...

  3. 【原创】NES第一波:如何用通用型6502宏汇编器,制用NES/FC游戏。

    在163的博客关了呀.在这边重新开张了. 以后若网友有什么要长篇解答的问题,也在这儿作答. 作为第一波原创文章,我打算做一次小白示范.那就是一步一步的展示某个汇编编译器的用法. 一.科普 很多人认为程 ...

  4. 有容云:上车 | 听老司机谈Docker安全合规建设

    编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...

  5. 夯实Java基础(十)——抽象类和接口

    转载自:http://cmsblogs.com/ 该博主的网站上干货非常!非常!非常多(说三遍),强烈推荐大家前去学习. 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法 抽象类与接口是 ...

  6. kali,ubuntu, debain DNS 配置

    kali 是基于 debain 的一个 Linux 发行版 DNS 的配置 是在文件 /etc/resolv.conf  下. 但是,我们会发现 /etc/resolv.conf 每次重启都会失效, ...

  7. shardingjdbc 强制路由走主库查询实时数据 避免主从同步数据延迟

    @Beanpublic shardingsphere.demo.entity.Order order(){ shardingsphere.demo.entity.Order order=new Ord ...

  8. Hystrix超时测试

    package com.cookie.test; import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.Hystr ...

  9. 2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)

    题目传送门 大致题意: 输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串.子序列. sample input: 801001 ...

  10. Linux--shell练习题

    1.判断/etc/inittab文件是否大于100行,如果大于,则显示”/etc/inittab is a big file.”否者显示”/etc/inittab is a small file.” ...