树状数组——pku2481

先按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");
}
}

  

原文地址:https://www.cnblogs.com/huhuuu/p/2108238.html