kb-07线段树-06离散化(与第四题类似)
2024-09-29 22:54:48
/*
zoj1610
这题是离散化,区间特殊查询的,和之前的第4 题是异曲同工的
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int l,r,value;
}tr[]={};
int col[]={};
int c[]={};
int discrete[]={};
void build(int rt,int l,int r)
{
tr[rt].l=l;
tr[rt].r=r;
tr[rt].value=-;
if(l==r)
return ;
int mid=(l+r)/;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
}
void Pushdown(int rt)
{
tr[rt<<].value=tr[rt<<|].value=tr[rt].value;
tr[rt].value=-;
}
void Update(int rt,int l,int r,int x)
{
if(tr[rt].value==x)
return ;
if(tr[rt].l>=l&&tr[rt].r<=r)
{
tr[rt].value=x;
return ;
}
if(tr[rt].value!=-)
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<<].value==tr[rt<<|].value&&tr[rt<<].value!=-)
tr[rt].value=tr[rt<<].value;
}
int erfen(int l,int r,int x)
{
while(l<=r)
{
int mid=(l+r)/;
if(x<discrete[mid])
r=mid-;
else
l=mid+;
}
return r;
}
void Query(int rt)
{
if(tr[rt].value!=-)
{
for(int i=tr[rt].l;i<=tr[rt].r;i++)
col[i]=tr[rt].value;
return ;
}
if(tr[rt].l==tr[rt].r)
return ;
Query(rt<<);
Query(rt<<|);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
int a[][]={};
int t=;
memset(col,-,sizeof(col));
memset(c,,sizeof(c));
memset(tr,,sizeof(tr));
memset(discrete,,sizeof(discrete));
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a[i][],&a[i][],&a[i][]);
discrete[t++]=a[i][];
discrete[t++]=a[i][];
}
sort(discrete,discrete+t);
int z=;
for(int i=;i<t;i++)
{
if(discrete[i]!=discrete[i-])
discrete[z++]=discrete[i];
}
for(int i=z-;i>;i--)
{
if(discrete[i]-discrete[i-]>)
discrete[z++]=discrete[i-]+;
}
sort(discrete,discrete+z);
for(int i=z;i>;i--)
{
discrete[i]=discrete[i-];
}
build(,,z+);
for(int i=;i<n;i++)
{
int ll=erfen(,z,a[i][]);
int rr=erfen(,z,a[i][]);
Update(,ll,rr-,a[i][]);
}
Query();
int temp=-;
for(int i=;i<=z;i++)
{
if(temp!=col[i])
{
c[col[i]]++;
temp=col[i];
}
}
for(int i=;i<=;i++)
{
if(c[i]>)
{
printf("%d %d\n",i,c[i]);
}
}
printf("\n");
}
return ;
}
最新文章
- Java 读写文件方案
- poj1155 TELE (树上的背包)
- 使用Python从Markdown文档中自动生成标题导航
- android-自定义控件之液位指示器
- MongooseJS 4.6.4 发布,MongoDB 连接包
- javascript判断手机旋转横屏竖屏
- easyui treegrid 分页
- js定时器的一些小问题
- YARN应用程序的开发步骤
- js Module模式
- Alljoyn 概述(1)
- IOS开发:UIAlertView使用
- asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
- xhr.readyState就绪状态
- Git初学二(SSH免密)
- python generator用法
- mysql 将一张表的数据更新到另外一张表中
- OOP 面向对象的理解
- Spring+Mybatis整合过程中找不到.properties文件
- REST与RESTFul API最佳实践