题意: 有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 }
SPOJ RATING
时间: 2024-10-29 19:17:57