SPOJ RATING

题意: 有N(N≤300000)coder, 每个coder[i]有两个属性A[i] 和 H[i] , 。

当(A[i] ≥ A[j] && H[i] ≥ H[j]) && (A[i] > A[j] || H[i] > H[j]) 时,认为coder[i] 比 coder[j]优秀 ,问每个coder[i]比多少个其他的coder优秀?
我的代码中 X为A   Y为H
先对X进行升序排序,X相同时对Y进行升序排序
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string.h>
 4 #include <algorithm>
 5 using namespace std;
 6 int c[100005],k,m,lv[300002]={0};
 7 struct coder{
 8     int x,y,id;
 9 }l[300002];
10 int lowbit(int x){return x&(-x);}                           //树状数组模板,直接用
11 int sum(int b){
12     int  sum=0;
13     while(b>0){
14         sum+=c[b];
15         b-=lowbit(b);
16     }
17     return sum;
18 }
19 void add(int x){
20     while(x<=100005){
21         ++c[x];
22         x+=lowbit(x);
23     }
24 }
25 bool cmp(coder a,coder b){
26     return a.x==b.x?a.y<b.y:a.x<b.x;
27 }
28 int main(){
29         scanf("%d",&k);
30         for(int j=1;j<=k;++j){
31             scanf("%d%d",&l[j].x,&l[j].y);
32             l[j].id=j;                                              //记录ID,用于以后的顺序输出
33         }
34         memset(c,0,sizeof(c));
35         sort(l+1,l+k+1,cmp);
36         for(int i=1;i<=k;i++){
37             if(i>1&&l[i-1].x==l[i].x&&l[i-1].y==l[i].y)lv[l[i].id]=lv[l[i-1].id];//当X1=X2&&Y1=Y2时,直接调用else哪里的方法会统计过多
38             else lv[l[i].id]=sum(l[i].y);                                       //由于已将排好序的,而且经过判断,直接调用的时候,X1=X2时,Y2一定大于Y1,所以可以直接统计
39             add(l[i].y);
40         }
41         for(int i=1;i<=k;i++){
42             printf("%d\n",lv[i]);                   //按顺序一行一个输出
43         }
44     return 0;
45 }

 

posted @ 2014-08-09 14:14  Mr.XuJH  阅读(112)  评论(0编辑  收藏  举报