原文:http://blog.acmj1991.com/?p=687
题意:给你一些区间这些区间都会图上不同的颜色,并且后面的颜色会覆盖前面的颜色。问最后能显示出来多少种颜色
思路:因为区间范围比较大,先得对区间进行离散化处理,然后用线段树记录区间颜色。最后统计颜色的种数。
不过在poj上的数据有点缺陷比如
3
1 3
1 10
6 10
有些同学离散有问题,4 5区间内可能有颜色,不能直接去掉
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define L(st)(st<<1)
#define R(st)(st<<1|1)
#define maxN 10010
int ans;
bool flag[maxN];
struct point{
int left,right;
int co;
}po[20*maxN];
struct node{
int num,id;
bool is;
}p[2*maxN];
bool cmp(const node &a,const node &b)
{
return a.num<b.num;
}
void init(int ll,int rr,int rt)
{
po[rt].right=rr,po[rt].left=ll;
po[rt].co=-1;
if(ll==rr)return ;
int mid=(ll+rr)>>1;
init(ll,mid,L(rt));
init(mid+1,rr,R(rt));
}
void insert(int left,int right,int co,int rt)
{
if(po[rt].right==right&&po[rt].left==left){
po[rt].co=co;
return ;
}
int mid=(po[rt].right+po[rt].left)>>1;
if(po[rt].co!=-1){
po[R(rt)].co=po[L(rt)].co=po[rt].co;
po[rt].co=-1;
}
if(right<=mid){insert(left,right,co,L(rt));}
else if(left>mid){insert(left,right,co,R(rt));}
else{
insert(left,mid,co,L(rt));
insert(mid+1,right,co,R(rt));
}
}
void query(int ll,int rr,int rt)
{
if(po[rt].co!=-1&&po[rt].left==ll&&po[rt].right==rr)
{
if(flag[po[rt].co]==0){ans++;flag[po[rt].co]=true;}
return ;
}
if(ll==rr){return ;}
int mid;
mid=(po[rt].left+po[rt].right)>>1;
if(rr<=mid)query(ll,rr,rt<<1);
else if(ll>mid)query(ll,rr,rt<<1|1);
else{
query(ll,mid,rt<<1);
query(mid+1,rr,rt<<1|1);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int ll[maxN],rr[maxN];
int n,num=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&ll[i],&rr[i]);
p[num].num=ll[i],p[num].id=i;
p[num++].is=true;
p[num].num=rr[i],p[num].id=i;
p[num++].is=false;
}
sort(p,p+num,cmp);
int temp=-1,su=0;
for(int i=0;i<num;i++)
{
if(p[i].num>temp+1)
su++;
if(p[i].num!=temp)
temp=p[i].num,su++;
if(p[i].is)
ll[p[i].id]=su;
else
rr[p[i].id]=su;
}
init(1,su,1);
for(int i=0;i<n;i++)
insert(ll[i],rr[i],i+1,1);
ans=0;
query(1,su,1);
printf("%d\n",ans);
memset(flag,0,sizeof(flag));
}
}
本文介绍了一种通过离散化和线段树解决区间染色问题的方法,详细解释了如何统计最终可见的颜色数量,特别注意数据集中的特殊情况。
1141

被折叠的 条评论
为什么被折叠?



