/*
poj2528
  线段树 好题,用到了离散化,二分定位,特殊的区间查寻方式;在下面的代码注释中有详细的解释;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
typedef struct
{
int l,r;
int cnt;//记录该段有几张海报;
int num;//记录该段下面是哪一张海报,0表示没有还海报或海报不唯一;
}Node;
int a[][],n,dot[]={},cou[]={};
Node tr[];
void build(int rt,int l,int r)
{
tr[rt].l=l;
tr[rt].r=r;
tr[rt].cnt=;
tr[rt].num=;
if(l==r)
return ;
int mid=(l+r)/;
build(rt<<,l,mid);
build((rt<<)|,mid+,r);
}
void Pushdown(int rt)
{
tr[rt<<].cnt=;
tr[rt<<|].cnt=;
tr[rt<<].num=tr[rt].num;
tr[rt<<|].num=tr[rt].num;
tr[rt].cnt=;
tr[rt].num=;
}
void Update(int rt,int l,int r,int x)
{
if(tr[rt].l==l&&tr[rt].r==r)
{
tr[rt].cnt=;
tr[rt].num=x;
return;
}
if(tr[rt].cnt==)//当只有一张海报在这个区间的时候才需要pushdown所以可以判断一下;也可以写在pushdown函数里面,我觉得写在外面比较块;
Pushdown(rt);
if(l<=tr[rt<<].r)
{
if(r<=tr[rt<<].r)
Update(rt<<,l,r,x);
else
Update(rt<<,l,tr[rt<<].r,x);
}
if(r>=tr[rt<<|].l)
{
if(l>=tr[rt<<|].l)
Update(rt<<|,l,r,x);
else
Update(rt<<|,tr[rt<<|].l,r,x);
}
if(tr[rt<<].num==tr[rt<<|].num&&tr[rt<<].cnt==&&tr[rt<<|].cnt==)//这以下是pushup的操作,写在这里了;
{
tr[rt].cnt=;
tr[rt].num=tr[rt<<].num;
}
else
tr[rt].cnt=;
}
/*
查询操作比较有趣,因为是查寻区间的海报种类,一个海报可能是首尾可见而中间不可见,所以没办法直接查得,
所以在树的结点上记录的是海报的编号,这样就可以用一个辅助的数组记录哪一个在此次查询中出现过;、
所以每次查询要全区间查询,然后再扫一遍数组;
、每次扫到区间内容一质的时候就不用再扫了;
*/
void Query(int rt)
{
if(tr[rt].cnt==)
{
cou[tr[rt].num]=;
return ;
}
if(tr[rt].l==tr[rt].r)
return ;
if(tr[rt].cnt==)
return ;
Query(rt<<);
Query(rt<<|);
}
int Erfen(int l,int r,int x)//用来确定该点在线段上的位置(离散后的位置);
{
while(l<=r)
{
int mid=(l+r)/;
if(x<dot[mid])
r=mid-;
else
l=mid+;
}
return r;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(dot,,sizeof(dot));
scanf("%d",&n);
int z=;
for(int i=;i<n;i++)
{
scanf("%d%d",&a[i][],&a[i][]);
dot[z++]=a[i][];
dot[z++]=a[i][];
}
sort(dot,dot+z);//将输入的数据排序后是离散化;因为数据范围比较大,因为只和区间有关,与区间内部的点没有关系,所以只要区间首尾就好;
int t=;
for(int i=;i<z;i++)
{
if(dot[i]!=dot[i-])
dot[t++]=dot[i];
}
for(int i=t-;i>;i--)
{
if(dot[i]-dot[i-]>)
dot[t++]=dot[i-]+;
}
sort(dot,dot+t);
for(int i=t;i>;i--)
dot[i]=dot[i-];
memset(tr,,sizeof(tr));
build(,,t+);
for(int i=;i<=n;i++)
{
int temp1=Erfen(,t,a[i-][]);
int temp2=Erfen(,t,a[i-][]);
Update(,temp1,temp2,i);
}
memset(cou,,sizeof(cou));
Query();
int ans=;
for(int i=;i<=n;i++)
if(cou[i]==)
ans++;
printf("%d\n",ans);
}
return ;
151 }

kb-07专题线段树-04--离散化;的更多相关文章

  1. ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)

    这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...

  2. hdu1542 Atlantis (线段树+扫描线+离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. 【BZOJ-4653】区间 线段树 + 排序 + 离散化

    4653: [Noi2016]区间 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 107  Solved: 70[Submit][Status][Di ...

  5. 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化

    4636: 蒟蒻的数列 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 247  Solved: 113[Submit][Status][Discuss ...

  6. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. [HDOJ5877]Weak Pair(DFS,线段树,离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意:给一棵树和各点的权值a,求点对(u,v)个数,满足:1.u是v的祖先,2.a(u)*a(v ...

  8. HDU 1255 覆盖的面积 (线段树+扫描线+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和. 因为n只有1000,所以我离散化 ...

  9. POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]

    题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...

  10. poj2299--B - Ultra-QuickSort(线段树,离散化)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 41215   Accepted: 14915 ...

随机推荐

  1. [转]maven项目部署到tomcat

    其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...

  2. codeforce Gym 100500C ICPC Giveaways(水)

    读懂题意就是水题,按照出现次数对下标排一下序,暴力.. #include<cstdio> #include<algorithm> #include<cstring> ...

  3. Java 可变长参数列表

    Java中定义了变长参数,允许在调用方法时传入不定长度的参数. 定义及调用 在定义方法时,在最后一个形参后加上三点 …,就表示该形参可以接受多个参数值,多个参数值被当成数组传入.上述定义有几个要点需要 ...

  4. Hbase 完全分布式 高可用 集群搭建

    1.准备 Hadoop 版本:2.7.7 ZooKeeper 版本:3.4.14 Hbase 版本:2.0.5 四台主机: s0, s1, s2, s3 搭建目标如下: HMaster:s0,s1(备 ...

  5. PAT (Basic Level) Practise (中文)- 1009. 说反话 (20)

    http://www.patest.cn/contests/pat-b-practise/1009 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在 ...

  6. SQL数据库中各种字段类型的说明

    (1)char.varchar.text和nchar.nvarchar.ntext     char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是 ...

  7. iOS JS 交互之利用系统JSContext实现 JS调用oc方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的, ...

  8. python @staticmethod和@classmethod

    Python其实有3个方法,即 静态方法 (staticmethod), 类方法 (classmethod)和 实例方法. 如下: def foo(x): print "executing ...

  9. skimage学习(一)

    skimage即是Scikit-Image.基于python脚本语言开发的数字图片处理包 skimage包由许多的子模块组成,各个子模块提供不同的功能.主要子模块列表如下: data子模块学习 导入d ...

  10. Voyager下的Settings方法

    设置网站标题,logo,描述: 自定义setting字段,添加group为文章,key为title的字段: 添加成功: 前端页面写法: <img src="{{ Voyager::im ...