您的位置:首页 > 其它

树状数组——pku2481

2011-07-16 15:53 281 查看
先按s从小到大排序
若相同再按E从大到小
在点相同时要特殊处理
View Code

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int n;
int tree[200009];
int all[200009];
int temp[200009];

struct data
{
int l,r;
int no;
}node[200009];

int lowbit(int x)
{
return x&(-x);
}

void updata(int x,int c)
{
int i;
for(i=x;i<=n;i+=lowbit(i))
{
tree[i]+=c;
}
}

int getsum(int x)
{
int i;
int temp=0;
for(i=x;i>=1;i-=lowbit(i))
{
temp+=tree[i];
}
return temp;
}

int cmp(data a,data b)
{
if(a.l==b.l)
return a.r>b.r;
else
return a.l<b.l;
}

int main()
{
n=100000;
int t;
while(scanf("%d",&t),t)
{
int i;

for(i=1;i<=100000;i++)
{
tree[i]=0;
all[i]=0;
}

for(i=1;i<=t;i++)
{
scanf("%d%d",&node[i].l,&node[i].r);
node[i].no=i;
}

sort(&node[1],&node[t+1],cmp);

for(i=1;i<=t;i++)
{
if(node[i].l!=node[i-1].l||node[i].r!=node[i-1].r)//如果改点与前面的不同
all[i]=getsum(n)-getsum(node[i].r-1);
else//若相同的话
all[i]=all[i-1];
updata(node[i].r,1);
}

for(i=1;i<=t;i++)
{
temp[node[i].no]=all[i];
}
printf("%d",temp[1]);
for(i=2;i<=t;i++)
{
printf(" %d",temp[i]);
}
printf("\n");
}
}


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