CodeForces 19D Points
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!
Input
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.
Output
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.
Sample Input
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 <bits/stdc++.h> using namespace std;
const int maxn = 2e5 + ;
typedef pair < int ,int > dii;
struct operation
{
int x , y , tp ;
}op[maxn];
char str[];
int c,n,QueryY; vector < int > vi;
set < int > :: iterator it , it2; struct Segmenttree
{
typedef int SgTreeDataType;
struct treenode
{
int L , R ;
SgTreeDataType maxy;
set < int > s;
void updata(SgTreeDataType v){
s.insert(v);
maxy=max(maxy,v);
}
void remove(SgTreeDataType v){
s.erase(v);
if(s.empty()) maxy=;
else{
it=s.end();it--;
maxy=*it;
}
}
}; treenode tree[maxn * ]; inline void push_up(int o){
int lson = o << , rson = o << | ;
tree[o].maxy=max(tree[lson].maxy,tree[rson].maxy);
} void build(int L , int R , int o){
tree[o].L = L , tree[o].R = R,tree[o].maxy=;tree[o].s.empty();
if (R > L){
int mid = (L+R) >> ;
build(L,mid,o<<);
build(mid+,R,o<<|);
}
} void updata(int p,SgTreeDataType v,int o){
int L = tree[o].L , R = tree[o].R;
if (L==R) tree[o].updata(v);
else{
int mid = (L+R)>>;
if (p <= mid) updata(p,v,o<<);
else updata(p,v,o<<|);
push_up(o);
}
} void remove(int p,SgTreeDataType v,int o){
int L = tree[o].L , R = tree[o].R;
if (L==R) tree[o].remove(v);
else{
int mid = (L+R)>>;
if (p <= mid) remove(p,v,o<<);
else remove(p,v,o<<|);
push_up(o);
}
} dii query(int p,int o){
int L = tree[o].L , R = tree[o].R;
if (L>=p){
int lson = o << , rson = o << | ;
if(tree[o].maxy > QueryY){
if(L==R){
it = tree[o].s.upper_bound(QueryY);
return make_pair( L , *it);
}else{
if(tree[lson].maxy > QueryY) return query(p , lson);
else if(tree[rson].maxy > QueryY) return query(p , rson);
}
}else return make_pair(-,-);
}
else{
int mid = (L+R)>>;
dii res(-,-);
if (p <= mid) res = query(p,o<<);
if(~res.first) return res;
return query(p,o<<|);
}
}
}Sgtree; inline int GetRank(int x){
return lower_bound( vi.begin() , vi.begin() + c , x ) - vi.begin();
} int main(int argc,char *argv[]){
scanf("%d",&n);
for(int i = ; i <= n ; ++ i){
int x , y;
scanf("%s%d%d",str,&op[i].x,&op[i].y);
if(str[]=='a') op[i].tp = ;
else if(str[]=='r') op[i].tp = ;
else op[i].tp = ;
vi.push_back(op[i].x);
}
sort( vi.begin() , vi.end() );
c = unique( vi.begin() , vi.end() ) - vi.begin();
Sgtree.build( , c - , );
for(int i = ; i <= n ; ++ i){
op[i].x = GetRank( op[i].x );
if(op[i].tp==) Sgtree.updata(op[i].x,op[i].y,);
else if(op[i].tp==) Sgtree.remove(op[i].x,op[i].y,);
else{
if(op[i].x == c - ){
printf("-1\n");
continue;
}
QueryY = op[i].y;
dii ans = Sgtree.query(op[i].x + , );
if(ans.first==-) printf("-1\n");
else printf("%d %d\n",vi[ans.first],ans.second);
}
}
return ;
}
CodeForces 19D Points的更多相关文章
- CodeForces 19D Points (线段树+set)
D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- CodeForces 19D Points(离散化+线段树+单点更新)
题目链接: huangjing 题意:给了三种操作 1:add(x,y)将这个点增加二维坐标系 2:remove(x,y)将这个点从二维坐标系移除. 3:find(x,y)就是找到在(x,y)右上方的 ...
- CodeForces 19D Points(线段树+map)
开始想不通,后来看网上说是set,就有一个想法是对每个x建一个set...然后又想直接建立两重的set就好,最后发现不行,自己想多了... 题意是给你三种操作:add (x y) 平面添加(x y) ...
- codeforces 19D D. Points 树套树
D. Points Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/19/problem/D De ...
- Codeforces Beta Round #19D(Points)线段树
D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- codeforces 872E. Points, Lines and Ready-made Titles
http://codeforces.com/contest/872/problem/E E. Points, Lines and Ready-made Titles time limit per te ...
- codeforces 251A Points on Line(二分or单调队列)
Description Little Petya likes points a lot. Recently his mom has presented him n points lying on th ...
- CodeForces 577E Points on Plane(莫队思维题)
题目描述 On a plane are nn points ( x_{i}xi , y_{i}yi ) with integer coordinates between 00 and 10^{6} ...
- 『ACM C++』 Codeforces | 1066A - Points in Segments
大一生活真 特么 ”丰富多彩“ ,多彩到我要忙到哭泣,身为班长,很多班级的事情需要管理,也是,什么东西都得体验学一学,从学生会主席.团委团总支.社团社长都体验过一番了,现在差个班长也没试过,就来体验了 ...
随机推荐
- SQL-MICK基础
/*Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据:2.where子句基于指定的条件对记录行进行筛选:3.group by子句将数据划分为多个分组:4.使用聚集函数进行计算: ...
- (3)选择元素——(15)总结(Summary)
With the techniques that we have covered in this chapter, we should now be able to locate sets of el ...
- RIP协议两个版本号对不连续子网的支持情况实验
(增加时注明"会员咨询")
- 怎么给iOS项目打包
1 首先要选中项目中的真机測试,不要模拟器 ,然后从上边的菜单条中找product watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29tZXJhaW43 ...
- Codeforces Round #274 (Div. 2) E. Riding in a Lift(DP)
Imagine that you are in a building that has exactly n floors. You can move between the floors in a l ...
- MongoDB每64位版本下载
MongoDB每64位版本下载: http://dl.mongodb.org/dl/win32/x86_64 版权声明:本文博主原创文章,博客,未经同意不得转载.
- NSRunLoop个人理解
作者: xwang 出处: http://www.cnblogs.com/xwang/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保 ...
- 好的android编码习惯
上一期分享了android内存优化的一些总结,这一期说说我认为的好的编码习惯,然后下一期会做安卓数据库优化的一些总结,逐渐的会将一些性能优化点总结分享出来,肯定是不够全面的希望不足的地方欢迎指出. 良 ...
- Http协议学习小结
1.Http基本概述: HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通 ...
- extJs项目实战
extjs是因为在公司用到一次,也是公司唯一一个extjs的项目,当时拿到这个需求的时候,我有点懵逼,这他妈的什么鬼,参加工作两年不到的纯小白,没办法,这是工作,必须要完成的.硬着头皮做吧,好在最后弄 ...