题意:

n个操作,在200000*200000的平面上加删点

find 严格在坐标右上角,x最小,再y最小的点

线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y值是重要优化 )

#include <stdio.h>
#include <string.h>
#include <queue>
#include <set>
#include <functional>
#include <map> #define N 201000
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Mid(x,y) ((x+y)>>1)
#define ll int
using namespace std;
inline ll Max(ll a, ll b){ return a>b?a:b;}
inline ll Min(ll a, ll b){ return a<b?a:b;} int Point[N];
map<int, int> mymap; vector<int>G; struct node{
int l,r;
int num;
int maxy;
}tree[N*4];
set<int> treeset[N];
set<int> ::iterator p; void build( int l, int r, int id){
tree[id].l = l, tree[id].r = r;
tree[id].num = 0;
tree[id].maxy = 0;
if(l==r)return ;
int mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
} void insert(int pos, int id, int data, bool add){// add = true 插入data =false 删除data
if(tree[id].l == tree[id].r){
if(add)
treeset[pos].insert(data); else
treeset[pos].erase(data);
tree[id].num = treeset[pos].size();
if(tree[id].num)
tree[id].maxy = *treeset[pos].rbegin();
else
tree[id].maxy = 0;
return ;
}
int mid = Mid(tree[id].l, tree[id].r); if(pos <= mid)insert(pos, L(id), data, add);
else insert(pos, R(id), data, add); tree[id].num = tree[L(id)].num + tree[R(id)].num;
tree[id].maxy =Max( tree[L(id)].maxy , tree[R(id)].maxy);
} int query(int l, int r, int y, int id){
if( tree[id].l == tree[id].r ){
if(tree[id].num){ p = treeset[ tree[id].l ].upper_bound(y);
if(p != treeset[ tree[id].l ].end() ){
printf("%d ", Point[ tree[id].l ]);
return *p;
}
}
return -1;
}
if( l == tree[id].l && tree[id].r == r){
if(tree[id].num == 0 || tree[id].maxy <= y)
return -1;
}
int mid = Mid(tree[id].l , tree[id].r);
if(r <= mid) return query(l, r, y, L(id));
if(mid < l) return query(l, r, y, R(id)); int treey =query(l, mid, y, L(id));
if(treey > y) return treey;
return query(mid+1, r, y, R(id));
} struct QUE{
char c;
int u,v;
}que[N];
set<int> tempset;
void Input(int n){
int u,v; char s[10];
tempset.clear();
mymap.clear();
for(int i = 1; i <= n; i++){
scanf("%s %d %d", s, &u, &v);
que[i].c = s[0], que[i].u = u, que[i].v = v;
tempset.insert(u);
}
p = tempset.begin();
int size = tempset.size();
for(int i = 1; i <= size ; i++,p++){
mymap.insert(pair<int, int>(*p, i));
Point[i] = *p;
}
}
int go(int x){
return mymap.find(x) -> second;
}
int main(){
int n;
char s[10];
while(~scanf("%d",&n)){
for(int i = 1; i<=200001; i++)treeset[i].clear();
build(1,200001,1); Input(n); for(int i = 1; i<=n; i++){
int u = que[i].u, v = que[i].v;
if(que[i].c == 'a')
insert(go(u),1,v,1); else if(que[i].c == 'r')
insert(go(u),1,v,0); else if(que[i].c == 'f')
printf("%d\n", query(go(u)+1, 200001, v, 1)); }
}
return 0;
}
/*
7
add 1 1
add 3 4
find 0 0
remove 1 1
find 0 0
add 1 1
find 0 0 ans:
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 ans:
7 7
-1
5 5 10
add 5 7
add 2 1
add 8 8
add 5 10
add 2 5
find 7 5
find 8 3
find 2 2
find 5 4
find 2 6 ans:
8 8
-1
5 7
8 8
5 7 */

CF 19D 线段树+set压缩坐标轴+离散化map的更多相关文章

  1. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  2. HDU 6318.Swaps and Inversions-求逆序对-线段树 or 归并排序 or 离散化+树状数组 (2018 Multi-University Training Contest 2 1010)

    6318.Swaps and Inversions 这个题就是找逆序对,然后逆序对数*min(x,y)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...

  3. poj2528线段树解题报告,离散化+线段树

    题目网址:http://poj.org/problem?id=2528 题意: n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=1 ...

  4. hiho一下21周 线段树的区间修改 离散化

    离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...

  5. HDU 6183 Color it cdq分治 + 线段树 + 状态压缩

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Pro ...

  6. ZOJ 2301 Color the Ball 线段树(区间更新+离散化)

    Color the Ball Time Limit: 2 Seconds      Memory Limit: 65536 KB There are infinite balls in a line ...

  7. poj2528 Mayor's posters(线段树区间修改+特殊离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  8. CF620E New Year Tree(树形+dfs序+线段树+状态压缩)

    题目链接 题目大意 \(~~\)给出一棵 nn 个节点的树,根节点为 11.每个节点上有一种颜色 c\(_{i}\) 和m 次操作.操作有两种: \(~~~~\) 1. 1\(~\)u\(~\)c:将 ...

  9. 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)

    传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...

随机推荐

  1. SQL VIEW(视图)

    1,视图包含行和列,就像一个真实的表. 2,视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 3,我们可以向视图添加 SQL 函数.WHERE 以及 JOIN 语句,我们也可以提交数据,就像 ...

  2. c#指针用法示例。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  3. 玩转HTML5移动页面(优化篇)

    原文:http://www.grycheng.com/?p=472 承接上文<玩转HTML5移动页面(动效篇)>,上次说的是让页面动起来的一些小技巧.而页面动起来的根基是功能可用的页面,因 ...

  4. PHP面向对象的特性

    1.抽象性2.封装性3.继承extends4.多态

  5. C#开发攀爬集锦

    工具使用 Files has invalid value "<<<<<<< .mine". Illegal characters in p ...

  6. 类集对enum的支持。

    1,EmumMap public class EnumMap<K extends Enum<K>,V>extends AbstractMap<K,V>impleme ...

  7. [问题]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一

    今天添加了一个新类(包括m,h,xib文件),还没有调用,-编译遇到如下错误,根据错误提示, duplicate symbol param1 in: /Users/xxxx/Library/Devel ...

  8. 【转】.Net程序员玩转Android系列之三~快速上手

    原文:http://www.cnblogs.com/HouZhiHouJueBlogs/p/3962122.html 快速环境搭建和Hello World 第一步:JAVA SDK(JDK)的安装: ...

  9. Codeforces Round #197 (Div. 2) : E

    看了codeforces上的大神写的题解之后,才知道这道题水的根本! 不过相对前面两题来说,这道题的思维要难一点: 不过想到了水的根本,这题也真心不难: 方法嘛,就像剥洋葱一样,从外面往里面剥: 所以 ...

  10. <c:if>判断参数是否为空

    EL表达式判断字符串是否为空: <c:if test="${empty str}"> str为空</c:if> <c:if test="${ ...