您的位置:首页 > 其它

hdu 2528 Mayor's posters(线段树+离散化)

2017-04-26 19:29 375 查看
参考:http://blog.csdn.net/non_cease/article/details/7383736

https://wenku.baidu.com/view/71fc1659ba1aa8114431d97b.html

第一次做线段树离散化的题目。。。。

wa了好多次,才发现是数组开小了。。

#include <cstdio>
#include <cstring>
#include <algorithm>

const int MAXN = 11010;
int li[MAXN],ri[MAXN];
int x[MAXN*3];
int col[MAXN<<4];
bool hash[MAXN];
int cnt;

int binSearch(int l, int r, int val)
{
int lb = l;
int ub = r-1;
while(lb <= ub)
{
int mid = (lb+ub)/2;
if(x[mid] < val) lb = mid+1;
else if(x[mid] > val) ub = mid-1;
else return mid;
}
return -1;
}

void pushDown(int rt)
{
if(col[rt] != -1)
{
col[rt<<1] = col[rt<<1|1] = col[rt];
col[rt] = -1;
}
}

void insert(int L, int R, int c, int l, int r, int rt)
{
if(L <= l && r <= R)
{
col[rt] = c;
return;
}
pushDown(rt);
int mid = (l+r) >> 1;
if(L <= mid) insert(L,R,c,l,mid,rt<<1);
if(R > mid) insert(L,R,c,mid+1,r,rt<<1|1);
}

void query(int l, int r, int rt)
{
if(col[rt] != -1)
{
if(!hash[col[rt]])
{
hash[col[rt]] = true;
++cnt;
}
return;
}
if(l == r) return;
int mid = (l+r) >> 1;
query(l,mid,rt<<1);
query(mid+1,r,rt<<1|1);
}

int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int nn = 0;
for(int i = 0; i < n; ++i)
{
scanf("%d %d",&li[i],&ri[i]);
x[nn++] = li[i];
x[nn++] = ri[i];
}
std::sort(x,x+nn);
int m = std::unique(x,x+nn)-x;
for(int i = m-1; i > 0; --i)
if(x[i] != x[i-1] + 1) x[m++] = x[i-1]+1;
std::sort(x,x+m);
memset(col,-1,sizeof(col));
for(int i = 0; i < n; ++i)
{
int l = binSearch(0,m,li[i]);
int r = binSearch(0,m,ri[i]);
//离散化坐标后,就是从0开始的了
insert(l,r,i,0,m,1);
}
memset(hash,false,sizeof(hash));
cnt = 0;
query(0,m,1);
printf("%d\n",cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: