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< ...
随机推荐
- wpf采用Xps实现文档显示、套打功能(原创)
近期的一个项目需对数据进行套打,用户要求现场不允许安装office.页面预览显示必须要与文档完全一致,xps文档来对数据进行处理.Wpf的DocumentView 控件可以直接将数据进行显示,xps也 ...
- css reset浅谈
我们都知道,web开发中浏览器兼容性是困扰很多开发者的一个问题.所谓兼容性问题,即不同浏览器对同一段代码有不同的解析效果.而我们的需求往往是无论用户使用何种浏览器查看我们的网站,都应该获得相同或相近的 ...
- CentOS 6.5-默认没开启网络连接:开启网络连接
vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改网络, 禁止IP6开启,禁止自启动服务chkconfig
- grunt-mac上安装运行构建工具的总结(一)
安装node.js brew install node.js 安装grunt npm install -g grunt-cli 1.新建package.json,配置 { "name&quo ...
- workerman安装
1.workerman安装 workerman是php的一个socket框架,简化了socket编程,已经为很多企业所用,今天在centos的ngix+php下安装了workerman,过程记录如下. ...
- C#中获得汉字的首拼音(加强版)
/// <summary> /// 汉字拼音首字母列表 /// 包含了20901个汉字,收录的字符的Unicode编码范围为19968至40869 /// </summary> ...
- C++ 11 笔记 (四) : std::bind
std::bind 接受一个可调用的对象,一般就是函数呗.. 还是先上代码: void func(int x, int y, int z) { std::cout << "hel ...
- 2015年9月29日 sql 触发器
触发器(trigger):当有关联操作的时候使用(级联操作),属于ddl关键字. eg:下订单时,创建中的商品数量要减少:退票时,总的票数要增加. 在订单上建立触发器 ...
- 在mac系统安装Apache Tomcat的详细步骤
对于Apache Tomcat 估计很多童鞋都会,那么今天就简单说下在mac上进行tomcat的安装: 第一步:下载Tomcat 这里Himi下载的tomcat version:7. ...
- 利用if else 判断方程有几个根
static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Green; ...