您的位置:首页 > 其它

线段树之POJ2528 Mayor's posters

2015-08-10 13:50 288 查看
成段替换。

个人认为这题重点是离散化。渣渣也是参考别人题解的,所以不班门弄斧了。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <sstream>
using namespace std;

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

typedef long long LL;
const double pi=4.0*atan(1.0);
const int MAXN=100005;

int add[MAXN<<2];

struct node{
int x,y;
};
node poster[MAXN];
int lisan[MAXN<<2];
int biaoji[MAXN];

void PushDown(int rt,int len)
{
if(add[rt])
{
add[rt<<1]=add[rt];
add[rt<<1|1]=add[rt];
add[rt]=0;
}
}

void build(int l,int r,int rt)
{
add[rt]=0;
if(l==r)
{
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);

}

void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l && r<=R)
{
add[rt]=c;

return ;
}
PushDown(rt,r-l+1);
int m=(l+r)>>1;

if(L<=m)
update(L,R,c,lson);
if(m<R)
update(L,R,c,rson);

}
int ans;
void query(int l,int r,int rt)
{
if(add[rt])
{
if(biaoji[add[rt]]==0)
{
ans++;
biaoji[add[rt]]=1;
}
return ;

}
if(l==r)
return ;

int m=(l+r)>>1;
query(lson);
query(rson);
}
int lower(int x,int y,int k)
{
int m;
while(x<y)
{
m=(x+y)/2;
if(lisan[m]>=k)			//改成<=可以求递减序列
y=m;
else
x=m+1;
}
return x;
}
int main()
{
int n,m;
int i,j,k;
int x,y;
int T;
while(scanf("%d",&T)!=EOF)
{
while(T--)
{
scanf("%d",&n);
k=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&poster[i].x,&poster[i].y);

lisan[k++]=poster[i].x;
lisan[k++]=poster[i].y;

}
sort(lisan,lisan+k);
k=unique(lisan,lisan+k)-lisan;
for(i=k-1;i>0;i--)
{
if(lisan[i]-lisan[i-1]>1)
{
lisan[k++]=lisan[i]-1;
}
}
sort(lisan,lisan+k);
memset(biaoji,0,sizeof(biaoji));
build(1,k,1);
for(i=1;i<=n;i++)
{
int nx=lower(0,k,poster[i].x);
int ny=lower(0,k,poster[i].y);
update(nx+1,ny+1,i,1,k,1);
}
ans=0;
query(1,k,1);
printf("%d\n",ans);
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: