1 //本题的关键是离散化,不然数组的空间不能开那么大,接下来运用树状数组来存储,查找,问题便可迎刃而解 2 3 #include<iostream> 4 #include<memory.h> 5 #include<algorithm> 6 #include<cstdio> 7 using namespace std; 8 #define M 300005 9 10 struct node{ 11 int id,num; //id为记录输入的顺序,是建立一一映射的关键 12 }a[M]; 13 14 bool cmp(node a,node b){ 15 return a.num < b.num; 16 } 17 18 int s[M],Tree[M]; 19 20 int lowbit(int n){ 21 return n&(-n); 22 } 23 24 void update(int x,int d){ 25 while(x>0){ 26 Tree[x] += d; 27 x -= lowbit(x); 28 } 29 } 30 31 void getsum(int x){ 32 int sum = 0; 33 while(x<M){ 34 sum += Tree[x]; 35 x += lowbit(x); 36 } 37 printf("%d\n",sum); 38 } 39 40 int main(){ 41 // freopen("in.txt","r",stdin); 42 int t,n,i,m,value; 43 scanf("%d",&t); 44 while(t--){ 45 memset(Tree,0,sizeof(Tree)); 46 memset(s,0,sizeof(s)); 47 scanf("%d%d",&n,&m); 48 int sum = n*2+m; //把所有要输入的数据综合到一块,然后建立一一映射的关系(把大数变成小数,以缩小存储空间) 49 for(i=0; i<sum; ++i){ 50 scanf("%d",&a[i].num); 51 a[i].id = i; 52 } 53 sort(a,a+sum,cmp); 54 int count = 0; 55 s[ a[0].id ] = ++count; 56 for(i=1; i<sum; ++i){ //大数变小,建立成映射关系 57 if(a[i].num != a[i-1].num) 58 s[a[i].id] = ++count; 59 else 60 s[a[i].id] = count; 61 } 62 for(i=0; i<n*2; i+=2){ //更新树状数组结点信息(插线取点法) 63 update(s[i+1],1); 64 update(s[i]-1,-1); 65 } 66 for(i=n*2; i<sum; ++i) 67 getsum(s[i]); 68 } 69 return 0; 70 }