CF 19D 线段树+set压缩坐标轴+离散化map
题意:
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的更多相关文章
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- HDU 6318.Swaps and Inversions-求逆序对-线段树 or 归并排序 or 离散化+树状数组 (2018 Multi-University Training Contest 2 1010)
6318.Swaps and Inversions 这个题就是找逆序对,然后逆序对数*min(x,y)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...
- poj2528线段树解题报告,离散化+线段树
题目网址:http://poj.org/problem?id=2528 题意: n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=1 ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- HDU 6183 Color it cdq分治 + 线段树 + 状态压缩
Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Pro ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
- poj2528 Mayor's posters(线段树区间修改+特殊离散化)
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- CF620E New Year Tree(树形+dfs序+线段树+状态压缩)
题目链接 题目大意 \(~~\)给出一棵 nn 个节点的树,根节点为 11.每个节点上有一种颜色 c\(_{i}\) 和m 次操作.操作有两种: \(~~~~\) 1. 1\(~\)u\(~\)c:将 ...
- 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)
传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...
随机推荐
- PHP文件下载方式
<?php// 不能是中文目录,其实如果是 .rar, .zip 类的这些文件,直接连接就可以下载了!function download($file_dir,$file_name)//参数说明: ...
- PHP用memcached做实时分页
用memcached做分页缓存,可能很多人会觉得麻烦而不用.因为在增加.修改.删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以 ...
- Groovy 数组操作
将字符串转为map def str="['汤菜':['1000000028','1000000030'],'肉菜':['1000000032'],'素材':['1000000031']]&q ...
- TDirectory.GetDirectoryRoot获取指定目录的根目录
使用函数: System.IOUtils.TDirectory.GetDirectoryRoot 函数定义: class function GetDirectoryRoot(const Path: s ...
- Unity给力插件之MegaFiers
这是一个关于网格变形的插件.其中有非常多的功能. 这是它的API地址:http://www.west-racing.com/mf/ 花了2天的时间实践并整理了其中绝大多数的功能,只有一些关于特殊格式的 ...
- Firebird/InterBase内置函数使用说明
Firebird/InterBase内置函数使用说明(转自:圣域天堂) 2008-10-12 20:56 加*号为FB2.0加入的函数 整理:剑雷(jianlei) 2006-10-13 1. COU ...
- skiplist 跳表(1)
最近学习中遇到一种新的数据结构,很实用,搬过来学习. 原文地址:skiplist 跳表 为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等. ...
- bzoj 3052: [wc2013]糖果公园 带修改莫队
3052: [wc2013]糖果公园 Time Limit: 250 Sec Memory Limit: 512 MBSubmit: 506 Solved: 189[Submit][Status] ...
- 限制sqlserver最大内存后无法连接-EXEC sp_configure max server memory
在sql server 中设置了过小的 "max server memory"最大内存后,sqlserver可启动,但是无法连接. 网络上流行的"sqlserver 内存 ...
- 在Eclipse中安装ADT
启动 Eclipse,然后选择 Help > Software Updates….在出现的对话框中,单击 Available Software 选项卡. 单击 Add Site 在 Add Si ...