题意:

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. SVG

    目前SVG在国内的使用并不常见,并且关于svg的相关js库也不多,这里指出两款svg的库Snap.svg和svg.js,Snap.svg张鑫旭的博客上有关于他的使用APi http://www.zha ...

  2. php中CURL技术模拟登陆抓取数据实战,抓取某校教务处学生成绩。

    这两天有基友要php中curl抓取教务处成绩的源码,用于微信公众平台的开发.下面笔者只好忍痛割爱了.php中CURL技术模拟登陆抓取数据实战,抓取沈阳工学院教务处学生成绩. 首先,教务处登录需要验证码 ...

  3. VMware Workstation 10.0 下载 – 正版序列号+简体中文官方原版

    1.https://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.0-1295980.exe 2.https ...

  4. 用开源软件构建App的高效服务端

    1.APP后端的重要性 2.架构目标与选型 3.Apache/Nginx? 4.为何选择Php 5.4? 5.Phalcon还是其它? 6.MySql 5.6 / MariaDB ? 7.Cobar: ...

  5. #Leet Code# Convert Sorted Array to Binary Search Tree

    描述:递归 代码: class Solution: # @param num, a list of integers # @return a tree node def sortedArrayToBS ...

  6. 【WPF】Dispatcher及线程操作

    WPF 应用程序启动后,会有两个线程: 1. 一个是用来处理UI呈现(处理UI的请求,比如输入和展现等操作). 2. 一个用来管理 UI的 (对UI元素及整个UI进行管理). 像Winform一样,W ...

  7. HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1166 简单题,1A了,这个好像就是传说中的“点树”. 设当前结点表示线段[left, right],编号 ...

  8. 12个你未必知道的CSS小知识

    虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...

  9. Django下TemplateDoesNotExist 异常的解决方法:

    在settings中添加代码如下获取templates路径: import os import os.path BASE_DIR = os.path.dirname(os.path.dirname(_ ...

  10. libSVM 参数选择

    libSVM 参数选择  [预测标签,准确率,决策值]=svmpredict(测试标签,测试数据,训练的模型);    原文参考:http://blog.csdn.net/carson2005/art ...