CodeForces 19D Points (线段树+set)
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 这道题目对时间卡的比较狠,超时了好多次 题目的意思是在二维坐标系上找一个比指定点大的点, 一维用线段树,在线段树上套set. 题目的数据是1e9,我们可以离散化,也可以用动态线段树 这里用动态线段树,不用离散化。 其次,一开始用线段树,节点上的信息是这个区间X坐标被标记的数目。 在查询的时候,可以查询第一个比指定点x大的x坐标,然后再在这个x坐标节点上的set里面找符合条件的y坐标 这样的效率是n的,相当于顺序的一个一个点找过去。 后来线段树维护的是这个区间所有被标记的x坐标对应的y坐标的最大值。 整体效率n*logn*logn#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <queue>
#include <set> using namespace std;
typedef long long int LL;
const int maxn=2*1e5;
const int INF=0x7FFFFFFF;
int p;
int rt[maxn+5];
int ls[maxn*35+5];
int rs[maxn*35+5];
int sum[maxn*35+5];
set<int> a[maxn*35+5];
int n,m;
set<int>::iterator it;
int newnode()
{
ls[p]=rs[p]=0;
sum[p]=-1;
return p++;
}
int nn;
void pushup(int node)
{
if(!ls[node]&&rs[node])
sum[node]=sum[rs[node]];
else if(!rs[node]&&ls[node])
sum[node]=sum[ls[node]];
else if(ls[node]&&rs[node])
sum[node]=max(sum[ls[node]],sum[rs[node]]);
else
sum[node]=-1;
}
void update(int &node,int l,int r,int tag,int tag2,int flag)
{
if(!node) node=newnode();
if(l==r)
{
if(flag)
{ a[node].insert(tag2);
if(a[node].empty()) sum[node]=-1;
else
{
it=a[node].end();
it--;
sum[node]=*(it);
}
}
else
{
a[node].erase(tag2);
if(a[node].empty()) sum[node]=-1;
else
{
it=a[node].end();
it--;
sum[node]=*(it);
}
} return;
}
int mid=(l+r)>>1;
if(tag<=mid) update(ls[node],l,mid,tag,tag2,flag);
else update(rs[node],mid+1,r,tag,tag2,flag);
pushup(node);
}
int query(int node,int l,int r,int tag,int y)
{
if(!node) return -1;
if(y>=sum[node]) return -1; if(l==r)
{ nn=*a[node].upper_bound(y);
return l;
}
int ret;
int mid=(l+r)>>1;
if(tag>=mid) ret=query(rs[node],mid+1,r,tag,y);
else
{
ret=query(ls[node],l,mid,tag,y);
if(ret==-1)
ret=query(rs[node],mid+1,r,tag,y);
}
return ret;
}
int main()
{
scanf("%d",&n);
char c[10];
p=1;
int root=0;
int x,y;
int r=1e9;
for(int i=1;i<=n;i++)
{
scanf("%s",c);
scanf("%d%d",&x,&y);
if(c[0]=='a')
{
update(root,0,r,x,y,1);
}
else if(c[0]=='r')
{
update(root,0,r,x,y,0);
}
else if(c[0]=='f')
{
nn=INF;
int xx=query(root,0,r,x,y);
if(xx==-1||nn==INF)
{
printf("-1\n");
continue;
}
printf("%d %d\n",xx,nn);
}
}
return 0;
}
CodeForces 19D Points (线段树+set)的更多相关文章
- Codeforces Beta Round #19D(Points)线段树
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 19D Points(线段树+map)
开始想不通,后来看网上说是set,就有一个想法是对每个x建一个set...然后又想直接建立两重的set就好,最后发现不行,自己想多了... 题意是给你三种操作:add (x y) 平面添加(x y) ...
- Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)
Extending Set of Points 我们能发现, 如果把x轴y轴看成点, 那么答案就是在各个连通块里面的x轴的个数乘以y轴的个数之和. 然后就变成了一个并查集的问题, 但是这个题目里面有撤 ...
- Codeforces 1140F Extending Set of Points (线段树分治+并查集)
这题有以下几个步骤 1.离线处理出每个点的作用范围 2.根据线段树得出作用范围 3.根据分治把每个范围内的点记录和处理 #include<bits/stdc++.h> using name ...
- CodeForces 19D Points
Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coo ...
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- [hdu4347]The Closest M Points(线段树形式kd-tree)
解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...
随机推荐
- Linux中vi的使用
首先,如果vi中出现了方向键变成ABCD的情况,需要卸载默认的vim-common,再安装vim. sudo apt-get remove vim-common sudo apt-get instal ...
- IoC最大的好处是什么?
IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有 ...
- 视差滚动(Parallax Scrolling)插件补充
13. Windows Windows (github) 是一个让你用占据整个屏幕的section来构建单面网站的插件.该插件提供给你一些回调函数,当新的section出现在可视区并且并且处理快照时被 ...
- php对gzip的使用(实例)
代码如下: if (!function_exists('gzdecode')) { function gzdecode ($data) { $flags = ord(substr($data, 3, ...
- 小明A+B(杭电2096)
/*小明A+B Problem Description 小明今年3岁了, 如今他已经可以认识100以内的非负整数, 而且可以进行100以内的非负整数的加法计算. 对于大于等于100的整数, 小明仅保留 ...
- HTML <a> 标签的状态和 target 属性
<a>的四种状态 A:link 连接平常状态 A:hover 鼠标放上去的时候 A:active 鼠标按下的时候 A:visited 连接被访问过后的状态 target属性 _bla ...
- idea-java项目配置
导入项目后,工程结构配置: 如果不加入tomcat 运行库,项目会报servlet jar 找不到的异常 tomcat服务器配置
- mysql数据库中,通过一条insert into语句,同时插入多个值
需求描述: 今天在看一本mysql的书籍,发现一个mysql中insert into好用的技巧,就是通过 1条insert into语句,插入多行数据,而不是多个insert into语句.在此记录下 ...
- linux磁盘分区详解
http://blog.csdn.net/aaronychen/article/details/2270048
- mybatise 动态sql
1. <if><choose> 动态sql 相当 <if> Java if 满足多个条件 <choose> <when> java ...