codeforces 19 D. Points(线段树+set二分)
题目链接: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二分)的更多相关文章
- Buses and People CodeForces 160E 三维偏序+线段树
Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- 【BZOJ4552】排序(线段树,二分答案)
[BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...
- CodeForces 877E DFS序+线段树
CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...
- [Codeforces 1199D]Welfare State(线段树)
[Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...
- [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)
[Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...
- luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)
luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- Codeforces 431E Chemistry Experiment 线段树 + 二分
Chemistry Experiment 维护一个权值线段树,然后二分答案. #include<bits/stdc++.h> #define LL long long #define LD ...
随机推荐
- 精准营销、批量提取QQ群成员号码
有时我们在做精准营销时,需要从社群里提取群成员的QQ号,群发邮件,常规的做法是手工一个个复制粘贴,这样的效率无疑是很低的,下面我来分享一个批量获取社群的QQ号方法. 需要具备以下工具: 1.大量精准Q ...
- Python 与数据库交互
安装:pip3 install pymysql 引入模块在python3里:from pymysql import * 使用步骤:1.创建Connection对象,用于建立与数据库的连接,创建对象调用 ...
- Wpf窗口设置屏幕居中最前显示
public Window() { InitializeComponent(); WindowStartupLocation = Win ...
- 【React踩坑记二】react项目实现JS路由跳转
这里使用的是4.31版本的react-router-dom "react-router-dom": "^4.3.1", 直接使用以下代码即可实现路由跳转 thi ...
- 守望先锋app(1)
这个app就是从守望先锋的官网下载相关的图片.文字.视频然后展示出来. 第一个功能是英雄介绍,所以先分析一波官网的数据.守望先锋的英雄数据的官方网站是http://ow.blizzard.cn/her ...
- Python连载30-多线程之进程&线程&线程使用举例
一.多线程 1.我们的环境 (1)xubuntu 16.04(2)anaconda(3)pycharm(4)python 3.6 2.程序:一堆代码以文本的形式存入一个文档 3.进程:程序运行的一个状 ...
- 强烈推荐优秀的Vue UI组件库
Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...
- 8.15 day33 进程池与线程池_协程_IO模型(了解)
进程池和线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度地利用计算机 ...
- Selenium+java - 手把手一起搭建一个最简单自动化测试框架
写在前面 我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬. 来看下面一段代码,如下图所示: 从上面图片代码来看,具体特征如下: driver对象在测试类中 ...
- spring全家桶的pom的基本配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...