您的位置:首页 > 其它

POJ 2481

2013-08-23 11:59 155 查看
题目链接
树状数组
 If Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj,
cowi is stronger than cowj.
查询比i大的数目
按E从大到小排序,再按S从小到大排序,
当i>j时,满足Si>=Sj,就满足 Ei - Si <Ej - Sj,cowj is stronger than cowi.
 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 100015
int arr
,ans
;
struct node{
int l,r,id;
bool operator <(const node & b) const { //sort
if(r==b.r) return l<b.l;
return r>b.r;
}

}a
;
int lowbit(int x){ return x&-x; }
void update(int x,int n)
{
while(x<N)
{
arr[x]+=n;
x+=lowbit(x);
}
}
int getsum(int x)
{
int sum=0;
while(x>0)
{
sum+=arr[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
int n,i;
while(scanf("%d",&n),n)
{

memset(arr,0,sizeof(arr));
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].l++;a[i].r++;
a[i].id=i;
}
sort(a,a+n);

for(i=0;i<n;i++)
{
if(i>0&&a[i].l==a[i-1].l&&a[i].r==a[i-1].r)
{
ans[a[i].id]=ans[a[i-1].id];
}
else
ans[a[i].id]=getsum(a[i].l);
update(a[i].l,1);
}
printf("%d",ans[0]);+

for(i=1;i<n;i++)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息