poj 2481加强版 zstu 3113 树状数组 排序、离散化

建议先做poj 2481 http://poj.org/problem?id=2481

我的详细解答http://www.cnblogs.com/wuyiqi/archive/2011/09/20/2182986.html

这道题目就是加了点东西,每个区间的数据范围变为32位,不离散化的话树状数组保存不下来

所以先进行离散化,按照poj 2481的做法,不通的地方是,只按x排序后对x坐标进行离散化,即依次按x从小到大把把各个排序后的区间标记为1,2,3.。。。

就相当于所有的x的坐标都变为了1~n的数,这样做不会影响结果,因为x间的相互关系还是不变的

随后再进行一次排序,跟poj2481一样了,不再赘述

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int MAX;
struct node {
__int64 x,y;
int nx,id;
}p[200010];
int c[200010];
int cmp(node a,node b)
{
if(a.y==b.y) return a.x<b.x;
return a.y>b.y;
}
int cmp1(node a,node b)
{
return a.x<b.x;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int d)
{
while(x<=MAX)
{
c[x]+=d;
x+=lowbit(x);
}
}
int sum(int x)
{
int ans=0;
while(x>0)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
int ans[200010];
int main()
{
int n,i,j,k;
while(scanf("%d",&n),n)
{
memset(c,0,sizeof(c));
for(i=0;i<n;i++)
{
scanf("%I64d%I64d",&p[i].x,&p[i].y);
p[i].id=i;
}
sort(p,p+n,cmp1);
p[0].nx=1;j=1;
for(i=1;i<n;i++)
{
if(p[i].x==p[i-1].x) p[i].nx=p[i-1].nx;
else p[i].nx=++j;
}
MAX=j;
sort(p,p+n,cmp);
ans[p[0].id]=0;
update(p[0].nx,1);
for(i=1;i<n;i++)
{
if(p[i].nx==p[i-1].nx&&p[i].y==p[i-1].y)
{
ans[p[i].id]=ans[p[i-1].id];
update(p[i].nx,1);
}
else
{
ans[p[i].id]=sum(p[i].nx);
update(p[i].nx,1);
}
}
printf("%d",ans[0]);
for(i=1;i<n;i++)
{
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}



你可能感兴趣的:(树状数组)