Codeforces Beta Round #19D(Points)线段树
2 seconds
256 megabytes
standard input
standard output
Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coordinate system on it as follows: point (0, 0) is located in the bottom-left corner, Ox axis is directed right, Oy axis is directed up. Pete gives Bob requests of three types:
- add x y — on the sheet of paper Bob marks a point with coordinates (x, y). For each request of this type it's guaranteed that point (x, y) is not yet marked on Bob's sheet at the time of the request.
- remove x y — on the sheet of paper Bob erases the previously marked point with coordinates (x, y). For each request of this type it's guaranteed that point (x, y) is already marked on Bob's sheet at the time of the request.
- find x y — on the sheet of paper Bob finds all the marked points, lying strictly above and strictly to the right of point (x, y). Among these points Bob chooses the leftmost one, if it is not unique, he chooses the bottommost one, and gives its coordinates to Pete.
Bob managed to answer the requests, when they were 10, 100 or 1000, but when their amount grew up to 2·105, Bob failed to cope. Now he needs a program that will answer all Pete's requests. Help Bob, please!
The first input line contains number n (1 ≤ n ≤ 2·105) — amount of requests. Then there follow n lines — descriptions of the requests. add x y describes the request to add a point, remove x y — the request to erase a point, find x y — the request to find the bottom-left point. All the coordinates in the input file are non-negative and don't exceed 109.
For each request of type find x y output in a separate line the answer to it — coordinates of the bottommost among the leftmost marked points, lying strictly above and to the right of point (x, y). If there are no points strictly above and to the right of point (x, y), output -1.
7
add 1 1
add 3 4
find 0 0
remove 1 1
find 0 0
add 1 1
find 0 0
1 1
3 4
1 1
13
add 5 5
add 5 6
add 5 7
add 6 5
add 6 6
add 6 7
add 7 5
add 7 6
add 7 7
find 6 6
remove 7 7
find 6 6
find 4 4
7 7
-1
5 5
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <set>
#include <map>
#include <vector>
#include <queue>
#define llt long long int
#define ml(x, y) ((x + y) >> 1)
#define mr(x, y) (((x + y) >> 1) + 1)
#define pl(p) (p << 1)
#define pr(p) ((p << 1) | 1)
#define N 200005
using namespace std;
map<int, int> mp;//离散化使用
vector<int> tx;//额外记录x
int segtree[N << ];//维护该区间的最大值,查询用
set<int> ty[N];//存对应x的所有y值
struct node
{
int x, y;
char op[];
}point[N];
void build(int l, int r, int p)//初始化线段树
{
segtree[p] = ;
if (l < r)
{
build(l, ml(l, r), pl(p));
build(mr(l, r), r, pr(p));
}
else
ty[l].clear();
}
void update(int l, int r, int p, int x, int y, int tag)
{
if (l == r)
{
if (tag)//add操作
{
ty[l].insert(y);
if (segtree[p] < y)
segtree[p] = y;
}
else
{
ty[l].erase(y);
segtree[p] = ty[l].empty() ? : *(--ty[l].end());
}
return;
}
if (ml(l, r) >= x)
update(l, ml(l, r), pl(p), x, y, tag);
else
update(mr(l, r), r, pr(p), x, y, tag);
segtree[p] = max(segtree[pl(p)], segtree[pr(p)]);
}
pair<int, int> query(int l, int r, int p, int x, int y)
{
if (r < x || segtree[p] < y)//未找到
return make_pair(-, -);
if (r == l)//找到了最合适的
return make_pair(r, *ty[r].lower_bound(y));
pair<int, int> ans = query(l, ml(l, r), pl(p), x, y);//先往左找
if (ans.first != -)//找到了
return ans;
return query(mr(l, r), r, pr(p), x, y);//未找到,右边找
}
int main()
{
int n, i, size;
while (~scanf("%d", &n))
{
tx.clear();
mp.clear();
for (i = ; i < n; i++)
{
scanf("%s%d%d", point[i].op, &point[i].x, &point[i].y);
tx.push_back(point[i].x);
}
sort(tx.begin(), tx.end());//排序
tx.erase(unique(tx.begin(), tx.end()), tx.end());//除去相同的元素
size = tx.size() - ;
build(, size, );
for (i = ; i <= size; i++)//进行离散化
mp[tx[i]] = i;
for (i = ; i < n; i++)
{
if (point[i].op[] == 'f')
{
pair<int, int> ans = query(, size, , mp[point[i].x] + , point[i].y + );
if (ans.first >= )
printf("%d %d\n", tx[ans.first], ans.second);
else
puts("-1");
continue;
}
update(, size, , mp[point[i].x], point[i].y, point[i].op[] == 'a'? : );
}
}
return ;
}
Codeforces Beta Round #19D(Points)线段树的更多相关文章
- CodeForces 19D Points (线段树+set)
D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- CF 19D - Points 线段树套平衡树
题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...
- Codeforces 295E Yaroslav and Points 线段树
Yaroslav and Points 明明区间合并一下就好的东西, 为什么我会写得这么麻烦的方法啊啊啊. #include<bits/stdc++.h> #define LL long ...
- Palisection(Codeforces Beta Round #17E+回文树)
题目链接 传送门 题意 给你一个串串,问你有多少对回文串相交. 思路 由于正着做不太好算答案,那么我们考虑用总的回文对数减去不相交的回文对数. 而不相交的回文对数可以通过计算以\(i\)为右端点的回文 ...
- Codeforces Beta Round #75 (Div. 2 Only)
Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...
- Codeforces Beta Round #35 (Div. 2)
Codeforces Beta Round #35 (Div. 2) http://codeforces.com/contest/35 A 这场的输入输出是到文件中的,不是标准的输入输出...没注意看 ...
- Codeforces Beta Round #12 (Div 2 Only)
Codeforces Beta Round #12 (Div 2 Only) http://codeforces.com/contest/12 A 水题 #include<bits/stdc++ ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #79 (Div. 2 Only)
Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...
随机推荐
- php pdo操作数据库
POD扩展是在PHP5中加入,该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题. PDO的特点: 性能.PDO 从一开始就吸取了现有数据库扩展成 ...
- Keras 文档阅读笔记(不定期更新)
目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...
- composer 加快更新速度
一.使用代理 set http_proxy=http://127.0.0.1:8087 //Windows export http_proxy=http://127.0.0.1:8087 //linu ...
- 转 PHP抽象类:无法实例化 (不错)
http://blog.csdn.net/kaituozheboke/article/details/52183726 一.抽象类: 无法实例化 类前加 abstract, 此类就成为抽象类,无法实例 ...
- 436 Find Right Interval 寻找右区间
给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”.对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着 ...
- D. Arpa's weak amphitheater and Mehrdad's valuable Hoses 分组背包模板题
http://codeforces.com/problemset/problem/742/D 并查集预处理出所有关系. 一开始的时候,我预处理所有关系后,然后选择全部的时候,另起了一个for,然后再判 ...
- 好用的SqlParamterList
public class SqlParameterList : List<SqlParameter> { #region Properties /// <summary> // ...
- eclipse debug java 源码
当我们需要研究java SE的时候,debug 源码是个不错的选择,可以帮助我们清楚了解java 封装jar包的具体实现. 因为oracle 提供的源码jar包为了节省空间,所以没有将调试信息一起打包 ...
- axis2客户端的几种调用方式
(1)使用RPC方式调用WebService // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient( ...
- Python游戏开发入门
Pygame简介与安装 1.Pygame安装 pip install pygame2.检测pygame是否安装成功 python -m pygame.examples.aliens Pygame最小开 ...