现在的位置: 首页 > 综合 > 正文

离散化坐标然后线段树解poj2528Mayor’s posters

2019年11月06日 ⁄ 综合 ⁄ 共 1343字 ⁄ 字号 评论关闭
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
	return a<b;
}
struct node
{
	int l,r;
}line[10010];
struct node1
{
	int l,r,m,w;
}tree[80010];
void create(int l,int r,int k)
{
	tree[k].l=l;
	tree[k].r=r;
	tree[k].m=(l+r)>>1;
	tree[k].w=0;
	if(l==r)
		return;
	create(l,tree[k].m,k<<1);
	create(tree[k].m+1,r,k<<1|1);
}
void join(int l,int r,int w,int k)
{
	if(tree[k].l==l&&tree[k].r==r)
	{
		tree[k].w=w;
		return;
	}
	if(tree[k].w>0)
	{
		tree[k<<1].w=tree[k<<1|1].w=tree[k].w;
		tree[k].w=-1;
	}
	else if(tree[k].w==0)
		tree[k].w=w;
	if(r<=tree[k].m)
		join(l,r,w,k<<1);
	else if(l>tree[k].m)
		join(l,r,w,k<<1|1);
	else
	{
		join(l,tree[k].m,w,k<<1);
		join(tree[k].m+1,r,w,k<<1|1);
	}
}
void in()
{
	int n,i,l,r;
	cin>>n;
	vector<int>v;
	for(i=0;i<n;i++)
	{
		cin>>line[i].l>>line[i].r;
		v.push_back(line[i].l);v.push_back(line[i].r);
	}
	sort(v.begin(),v.end(),cmp);
	v.erase(unique(v.begin(),v.end()),v.end());
	create(1,v.size(),1);
	for(i=0;i<n;i++)
	{
		l=lower_bound(v.begin(),v.end(),line[i].l)-v.begin()+1;
		r=lower_bound(v.begin(),v.end(),line[i].r)-v.begin()+1;
		join(l,r,i+1,1);
	}
}
int ans;
bool vis[20010];
void find(int k)
{
	if(tree[k].w!=-1)
	{
		if(!vis[tree[k].w])
		{
			ans++;
			vis[tree[k].w]=1;
		}
		return;
	}
	find(k<<1);
	find(k<<1|1);
}
int main()
{
	int	exp;
	cin>>exp;
	while(exp--)
	{
		in();
		ans=0;
		memset(vis,0,sizeof(vis));
		find(1);
		cout<<ans<<endl;
	}
}

抱歉!评论已关闭.