您的位置:首页 > 其它

POJ 2528 Mayor's posters 线段树 着色问题

2011-09-27 22:51 393 查看
//9368182 NKHelloWorld 2528 Accepted 1180K 79MS C++ 2792B 2011-09-27 22:07:26
//9368188 NKHelloWorld 2528 Accepted 1712K 63MS G++ 2792B 2011-09-27 22:08:48
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct STNODE//线段树中的节点
{
int left,right,color;
}stree[55000];
struct POINT//离散化专用
{
int point,num;
bool operator< (const POINT &other)const
{
return point < other.point;
}
}point[22000];
struct SEGMENT
{
int left,right;
}segment[11000];

int n,ans;
bool visit[22000];
void buildST(int pos,int l,int r)//建树
{
stree[pos].left = l;    stree[pos].right = r;   stree[pos].color = 0;
if(l!=r)
{
buildST(pos+pos,l,(l+r)>>1);
buildST(pos+pos+1,(l+r)/2+1,r);
}
}
void insertST(int pos,int l,int r,int color)
{
int mid;
if(stree[pos].left == l && stree[pos].right ==r)
{
stree[pos].color = color;   return ;
}
if(stree[pos].color > 0 &&stree[pos].color != color)
{
stree[pos+pos].color = stree[pos].color;    stree[pos+pos+1].color = stree[pos].color;  stree[pos].color = 0;
}
mid = (stree[pos].left + stree[pos].right)>>1;
if(mid >= r)
{
insertST(pos+pos,l,r,color);
}
else if(mid < l)
{
insertST(pos+pos+1,l,r,color);
}
else
{
insertST(pos+pos,l,mid,color);
insertST(pos+pos+1,mid+1,r,color);
}
}

void getAns(int pos)
{
if(stree[pos].color!=0)
{
if(!visit[stree[pos].color])
{
visit[stree[pos].color] = true; ans++;
}
return ;
}
getAns(pos+pos);
getAns(pos+pos+1);
}

int main()
{
int i,j,k,a,b,totcase;
scanf("%d",&totcase);
while(totcase --)
{
scanf("%d",&n);
//input and Li San Hua
for(i=1;i<=n;i++)
{
scanf("%d%d",&segment[i].left,&segment[i].right);
if(segment[i].left > segment[i].right)  swap(segment[i].left,segment[i].right);
point[i+i-2].point = segment[i].left;   point[i+i-2].num = -i;
point[i+i-1].point = segment[i].right;  point[i+i-1].num = i;
}
sort(point,point+n+n);
int _cnt = 1,_last = point[0].point;
for(i=0;i<n+n;i++)
{
if(point[i].point!=_last)
{
_cnt++;
_last = point[i].point;
}
if(point[i].num < 0)
segment[-point[i].num].left = _cnt;
else
segment[point[i].num].right = _cnt;
}
//Li San Hua finish
buildST(1,1,_cnt);
ans = 0;
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
{
insertST(1,segment[i].left,segment[i].right,i);
}
getAns(1);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: