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> ...
随机推荐
- JVM基础知识与配置
1 怎样设置JVM内存设置 本文向大家简介一下进行JVM内存设置几种方法.安装Java开发软件时.默认安装包括两个目录,一个JDK(Java开发工具箱).一个JRE(Java执行环境,内含JVM),当 ...
- spring FactoryBean配置Bean
概要: 实例代码具体解释: 文件夹结构 Car.java package com.coslay.beans.factorybean; public class Car { private String ...
- 常用Javascript函数与原型功能收藏
// 重复字符串 String.prototype.repeat = function(n) { return new Array(n+1).join(this); } // 替换全部 String. ...
- RGB 颜色对照表
R G B 值 R G B 值 R G B 值 黑色 0 0 0 #000000 黄色 255 255 0 #FFFF00 浅灰蓝色 176 224 230 #B0E0E6 象牙黑 41 36 ...
- React中props与state
以下内容均为个人理解. 1.state: 在react中,state可以看成管理页面状态的集合(实则一个对象而已),库里面的成员均为页面渲染变量,整个页面为一个状态机,当state发生变化时,页面会重 ...
- C++类中静态成员函数
引述自<深入探索C++对象模型>2001:5:1版次,p-150 static member functions的主要特性就是它没有this指针,所以: 1.它不能直接存取其所在class ...
- java导出word文件
java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...
- 如何快捷地使用ChemBio 3D检查结构信息
ChemBio 3D是一款三维分子结构演示软件,能够轻松快捷地进行化学结构的制作和立体旋转.ChemBio 3D Ultra 14作为ChemBio 3D的最新版本可以更加快捷地制作化学结构.本教程将 ...
- Effective C++ Item 16 Use the same form in corresponding uses of new and delete
1. When you created an array and want to return the memory to system. You need to explicitly add [] ...
- swift学习笔记之控制流
控制流: 1.if语句 let count = { print("yes") }else{ print("no") } 2.switch语句 (1)Swift中 ...