http://acm.hdu.edu.cn/showproblem.php?pid=1541
题被划在线段树里 刚开始想着是求区间k值 写着写着觉得错了 看着像求逆序数 写了个树状数组 怎么都过不了 无奈。。
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define N 50000 7 struct node 8 { 9 int x,y,p; 10 }s[N<<1]; 11 int po[N<<1],re[N<<2],n,num[N<<1],w = N; 12 bool cmpp(struct node a,struct node b) 13 { 14 return a.x<b.x; 15 } 16 void add(int i,int da) 17 { 18 while(i<=w) 19 { 20 re[i]+=da; 21 i += i&(-i); 22 } 23 } 24 int getsum(int i) 25 { 26 int s = 0; 27 while(i) 28 { 29 s+=re[i]; 30 i-=i&(-i); 31 } 32 return s; 33 } 34 int main() 35 { 36 int i,j,k; 37 while(~scanf("%d", &n)) 38 { 39 memset(re,0,sizeof(re)); 40 memset(num,0,sizeof(num)); 41 for(i = 1; i <= n ; i++) 42 { 43 scanf("%d%d",&s[i].x,&s[i].y); 44 s[i].x++; 45 k = getsum(s[i].x); 46 num[k]++; 47 add(s[i].x,1); 48 } 49 for(i = 0 ; i < n ; i++) 50 printf("%d\n",num[i]); 51 } 52 return 0; 53 }