大致题意:

  给出n个询问,每次询问有三种:

    1、往平面上加一个点

    2、删除平面上的一个点

    3、给出一个点p,查询平面上某点q,使得q.x>p.x且q.y>p.y,输出x轴坐标最小的q,若有多个,输出y最小的

    

    点的坐标较大,需要先离散点坐标,线段树维护x坐标对应的最大的y坐标,

    查询用线段树定位x坐标,用set数组查询y坐标即可,因为总共只会用2e5个点,不会超内存

   

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<cstdlib>
#include<cmath>
#include<list>
using namespace std;
#define MAXN 200100
#define eps 1e-7
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Fore(i,a,b) for(int i=a;i>=b;i--)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mkp make_pair
#define pb push_back
#define cr clear()
#define sz size()
#define met(a,b) memset(a,b,sizeof(a))
#define iossy ios::sync_with_stdio(false)
#define fre freopen
#define pi acos(-1.0)
#define inf 1e9+9
#define Vector Point
const int Mod=1e9+;
typedef unsigned long long ull;
typedef long long ll;
struct Point {
int x,y;
int mk,id;
bool operator < (const Point &a)const{
if(x==a.x) return y<a.y;
return x<a.x;
}
bool operator == (const Point &a)const{
return x==a.x && y==a.y;
}
void read(int idd,int mkk) {
scanf("%d%d",&x,&y);
id=idd;mk=mkk;
}
};
bool cmp(Point a,Point b){
return a.id<b.id;
}
Point ad[MAXN];
int add[MAXN];
int t[MAXN<<];
set<int>mp[MAXN];
set<int>::iterator it;
void up(int rt){
t[rt]=max(t[rt<<],t[rt<<|]);
}
void Change(int x,int l,int r,int rt){
if(l==r && r==x){
if(mp[x].size()==){
t[rt]=;
return ;
}
t[rt]=(*mp[x].rbegin());
return ;
}
int mid=l+r>>;
if(x<=mid) Change(x,lson);
else Change(x,rson);
up(rt);
}
int Query(int x,int xx,int l,int r,int rt){
int mid=l+r>>;
if(l>=xx) {
if(t[rt]>x){
if(l==r) return l;
else {
if(t[rt<<]>x) return Query(x,xx,lson);
else if(t[rt<<|]>x) return Query(x,xx,rson);
}
}else return inf; }else{
int res=inf;
if(xx<=mid) res=Query(x,xx,lson);
if(res!=inf) return res;
return Query(x,xx,rson);
}
}
int n,cnt;
char s[];
void solve(){
scanf("%d",&n);
cnt=;
For(i,,n){
scanf("%s",s);
if(s[]=='a') ad[i].read(i,);
else if(s[]=='r') ad[i].read(i,);
else ad[i].read(i,);
add[i]=ad[i].x;
}
cnt=n;
sort(add+,add+n+);
cnt=unique(add+,add++cnt)-(add+);
For(i,,n){
int idx=upper_bound(add+,add++cnt,ad[i].x)-(add+);
if(ad[i].mk==) {
mp[idx].insert(ad[i].y);
Change(idx,,cnt,);
}
else if(ad[i].mk==) {
mp[idx].erase(ad[i].y);
Change(idx,,cnt,);
}
else {
int ans=Query(ad[i].y,idx+,,cnt,);
if(ans==inf) {puts("-1");continue;}
it=mp[ans].upper_bound(ad[i].y);
if(it==mp[ans].end()) {puts("-1");continue;}
printf("%d %d\n",add[ans],(*it));
}
}
}
int main(){
// fre("in.txt","r",stdin);
int t=;
solve();
return ;
}

[Codeforces19D]Points 线段树的更多相关文章

  1. Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)

    Extending Set of Points 我们能发现, 如果把x轴y轴看成点, 那么答案就是在各个连通块里面的x轴的个数乘以y轴的个数之和. 然后就变成了一个并查集的问题, 但是这个题目里面有撤 ...

  2. CodeForces 19D Points (线段树+set)

    D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  3. [hdu4347]The Closest M Points(线段树形式kd-tree)

    解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...

  4. Codeforces Beta Round #19D(Points)线段树

    D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  5. CF 19D - Points 线段树套平衡树

    题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...

  6. Codeforces 1140F Extending Set of Points (线段树分治+并查集)

    这题有以下几个步骤 1.离线处理出每个点的作用范围 2.根据线段树得出作用范围 3.根据分治把每个范围内的点记录和处理 #include<bits/stdc++.h> using name ...

  7. Codeforces 295E Yaroslav and Points 线段树

    Yaroslav and Points 明明区间合并一下就好的东西, 为什么我会写得这么麻烦的方法啊啊啊. #include<bits/stdc++.h> #define LL long ...

  8. CodeForces19D:Points(线段树+set(动态查找每个点右上方的点))

    Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coo ...

  9. UVA10869 - Brownie Points II(线段树)

    UVA10869 - Brownie Points II(线段树) 题目链接 题目大意:平面上有n个点,Stan和Ollie在玩游戏,游戏规则是:Stan先画一条竖直的线作为y轴,条件是必需要经过这个 ...

随机推荐

  1. 关于NUL

    问题:正常的order by不起作用了,如下图 分析:使用notepad++打开,发现 NUL以字符'\0'作为字符串结束标志.'\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCI ...

  2. PHP函数方法

    补充一个P可以HP的特点函数:动态调用 function t(){ echo "welcome"; } function t2(){ echo "beatch" ...

  3. Windows.event

    获取鼠标位置 document.getElementById('div').onmousemove = function(e){ //--------Chrome, firefox 支持------- ...

  4. Hadoop笔记之搭建环境

    Hadoop的环境搭建分为单机模式.伪分布式模式.完全分布式模式. 因为我的本本比较挫,所以就使用伪分布式模式. 安装JDK 一般Linux自带的Java运行环境都是Open JDK,我们到官网下载O ...

  5. MSSQL ADO.NET

    为什么要学ADO.NET 之前我们所学的只能在查询分析器里查看数据,操作数据,我们让普通用户去学sql,所以我们搭建了一个界面(Web/Winform) 让用户方面的操作数据库中的数据 什么是ADO. ...

  6. 【译】第四篇 SQL Server代理配置数据库邮件

    本篇文章是SQL Server代理系列的第四篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.SQL Serve ...

  7. vue-loader 调用了cssLoaders方法配置了css加载器属性。

    module: { loaders: [ // 这里也是相应的配置,test就是匹配文件,loader是加载器, { test: /\.vue$/, loader: 'vue' }, { test: ...

  8. 利用Jsoup模拟跳过登录爬虫获取数据

    今天在学习爬虫的时候想着学习一下利用jsoup模拟登录.下面分为有验证码和无验证码的情况进行讨论. ---------------------------无验证码的情况---------------- ...

  9. 36 - 网络编程-TCP编程

    目录 1 概述 2 TCP/IP协议基础 3 TCP编程 3.1 通信流程 3.2 构建服务端 3.3 构建客户端 3.4 常用方法 3.4.1 makefile方法 3.5 socket交互 3.4 ...

  10. AttributeError: 'str' object has no attribute 'decode'

    ue = e.decode('latin-1')修改为: ue = e.encode('ascii', 'strict')