hihoCoder #1079 : 离散化 (线段树,数据离散化)
题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高。
思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去,最后还能看到及条线”。长度是0~L,即长度是L,进行离散化的时候,应该用1~L,每个数字表示一个单位长。还有就是按照提示所给的信息实现即可。步骤如下:
(1)保存n个数据,做成pair,并将所有出现过的数字在另外找地方排序,去掉重复的,再将数据紧缩化处理,那么大小在1~max。再将紧缩化的数据与原数据做成映射表。
(2)建立线段树,原始n个数据进行映射后对线段树插入更新。注意上限的问题,因为已经离散化了。每个节点上有个值val,表示处于此段区间的是编号为val的海报。
(3)DFS搜索线段树,遇到tag=1的节点就进行标记,然后返回,其子树都没用处的,已经被覆盖。可能会有重复的,比如一段为[2,3],一段为[3,5],因为不能放在一起,所以分开放的时候会有重复的val,要去重。
#include <bits/stdc++.h>
using namespace std;
const int N=;
int n,l,rr,ll,cnt=;
bool vis[N];
unordered_map<int,int> mapp;
pair<int,int> pai[N];
struct node
{
int val;
bool tag;
node *ll,*rr;
}; node *create()
{
node *tmp=new(node);
tmp->val=tmp->tag=;
tmp->ll=tmp->rr=;
return tmp;
} void update(int l,int r,int LL,int RR,int num,node *t) //其实可以不用递归,因为不用回溯
{
if(l==LL&&r==RR)//找到了对应区间
{
t->tag=;
t->val=num;
return ;
}
if( LL!=RR && !t->ll ) //有孩子,但是还没有建立
{
t->ll=create();
t->rr=create();
t->ll->tag= t->rr->tag= ;
t->ll->val= t->rr->val= t->val;
} int mid=((LL+RR)>>);
if(t->tag)//需要对此节点下推
{
if(t->ll)//前提是有孩子
{
t->ll->tag= t->rr->tag= ;
t->ll->val= t->rr->val= t->val;
}
t->tag=;
} if(l>mid) update(l,r,mid+,RR,num,t->rr);//在右边
else if(r<=mid) update(l,r,LL,mid,num,t->ll);//在左边
else
{
update(l,mid,LL,mid,num,t->ll);
update(mid+,r,mid+,RR,num,t->rr);
}
} void DFS(int LL,int RR,node *t) //进行深搜,搜到tag为1的就有用,可能存在重复
{
if(t->tag)
{
vis[t->val]=;//为了去重
return;
}
int mid=((LL+RR)>>);
DFS(LL,mid,t->ll);
DFS(mid+,RR,t->rr);
} int main()
{
//freopen("input.txt", "r", stdin); cin>>n>>l;
vector<int> vect; //辅助
for(int i=; i<n; i++)
{
scanf("%d%d",&ll,&rr);
pai[i]=make_pair(ll,rr);
vect.push_back(ll);
vect.push_back(rr);
} sort(vect.begin(),vect.end());
vect.push_back(-); //仅仅为了下面的for不会溢出。
int up=;
for(int i=;i<vect.size()-; i++) //紧缩化处理
{
if(vect[i]!=vect[i+])
mapp[vect[i]]=++up; //做个哈希表
}
vect.clear(); node *tree=create(); //建树根节点
tree->tag=; for(int i=; i<n; i++) //根据pair进行修改树。设置tag,在需要修改其儿子时在进行下推。
{
int L=mapp[pai[i].first];
int R=mapp[pai[i].second];
update(L,R-,,up-,i+,tree); //插入修改
} DFS(,up,tree);//深搜
for(int i=; i<=n; i++) if(vis[i]) cnt++;
cout<<cnt<<endl; return ;
}
AC代码
hihoCoder #1079 : 离散化 (线段树,数据离散化)的更多相关文章
- ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)
这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...
- 【POJ】2528 Mayor's posters ——离散化+线段树
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of Bytetown, A ...
- hpu校赛--雪人的高度(离散化线段树)
1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec 内存限制: 128 MB 提交: 81 解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...
- 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers
题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...
- poj/OpenJ_Bailian - 2528 离散化+线段树
传送门:http://bailian.openjudge.cn/practice/2528?lang=en_US //http://poj.org/problem?id=2528 题意: 给你n长海报 ...
- 南阳理工 题目9:posters(离散化+线段树)
posters 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 The citizens of Bytetown, AB, could not stand that ...
- SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
- hdu1542 Atlantis (线段树+扫描线+离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- 【bzoj4636】蒟蒻的数列 离散化+线段树
原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...
随机推荐
- TCP 错误代码 10013: 试图以其访问权限所禁止的方式访问套接字
大家遇到的问题可能是登录没反应,这时,大家要充分利用调试工具,调试工具可能会提示下面错误: 未能连接到 net.tcp://swk-pc:4502/chatservice.svc.连接尝试的持续时间为 ...
- 【220】◀▶ IDL 数组操作函数说明
参考:Array Creation Routines —— 创建数组函数参考:Array Manipulation Routines —— 操作数组函数 01 MAX 最大值. 02 MIN ...
- Flutter实战视频-移动电商-55.购物车_底部结算栏UI制作
55.购物车_底部结算栏UI制作 主要做下面结算这一栏目 cart_bottom.dart页面 先设置下内边距 拆分成三个子元素 全选 因为有一个文本框和一个全选的text文本,所以这里也用了Row布 ...
- UVaLive 3905 Meteor (扫描线)
题意:给定上一个矩形照相机和 n 个流星,问你照相机最多能拍到多少个流星. 析:直接看,似乎很难解决,我们换一个思路,我们认为流星的轨迹就没有用的,我们可以记录每个流星每个流星在照相机中出现的时间段, ...
- [开源]OSharpNS - .net core 快速开发框架 - 快速开始
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- Weekly Contest 78-------->808. Soup Servings
There are two types of soup: type A and type B. Initially we have N ml of each type of soup. There a ...
- UGUI实现unity摇杆
http://www.winig.cc/archives/348 好久没有写文章了,最近在做项目是用的unity最新的ui系统UGUI,项目需要做一个摇杆,网上大部分都是用的插件和NGUI做的摇杆,u ...
- Ogre 学习记录
http://www.cppblog.com/richardhe/articles/55722.html 1: 设计初衷 它设计初衷是完全跨平台的.抽象的接口隐藏了平台相关的细节. 它设计初衷是大幅度 ...
- OPENGL1_环境
补充说明: 1 vs2010自带opengl的库,不需要单独下载或做任何配置,(但是lib文件,dll文件放的位置过于分散,用的时候感觉不好用) 使用时直接用 #include <gl/GL.h ...
- IT兄弟连 JavaWeb教程 EL表达式中的运算
EL语言支持算符运算符.关系运算符和逻辑运算符等,以完成常见的数据处理操作.所有的运算符说明见表7.2. 表2 El表达式中的运算符