您的位置:首页 > 其它

POJ 2481 Cows

2015-12-18 13:13 183 查看
这道题是要求e更大且s更小的牛的数量,首先把所有的数据读入之后按照e从大到小,e相同的情况下s从小到大的顺序来排列;

从头开始遍历,这样能够保证e一定比前面的小,只要数前面有多少个s比自己的s小就可以计算出来有多少牛比自己更强,这种每次都要遍历数前面有多少个s比自己小的题目最好使用树状数组,能够更快地检索。

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;

#define maxn 500500

struct node{
int e,s;
int index;
};

bool operator <(node a,node b){
if(a.e == b.e)
return a.s < b.s;
return a.e > b.e;
}

node cow[maxn]={0};
int cnt[maxn]={0};
int tree[maxn]={0};

int getsum(int k){
int sum = 0;
for(;k>0;k-=k&(-k)){
sum += tree[k];
}
return sum;
}

void add(int k,int n){
for(;k<=n;k+=k&(-k)){
tree[k]++;
}
}

int main(){
int n;
while(scanf("%d",&n),n){

memset(cnt,0,sizeof(cnt));
memset(tree,0,sizeof(tree));
memset(cow,0,sizeof(cow));

for(int i=1;i<=n;++i){
scanf("%d%d",&cow[i].s,&cow[i].e);
cow[i].index = i;
}

sort(cow+1,cow+1+n);

add(cow[1].s+1, n);

for(int i=2;i<=n;++i){
if(cow[i].s == cow[i-1].s && cow[i].e == cow[i-1].e){
cnt[cow[i].index] = cnt[cow[i-1].index];
}
else{
cnt[cow[i].index] = getsum(cow[i].s+1);
}
add(cow[i].s+1, n);
}

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