树状数组之插线问点

来源:互联网 发布:我的世界java版本 编辑:程序博客网 时间:2024/06/08 03:25

点击打开链接

 # include<stdio.h># include<string.h># include<algorithm>using namespace std;int a[100005],c[100005];struct order{int num;int ord;}s[200005];bool cmp(order x,order y){return x.num<y.num;}int lowbit(int x){return x&-x;}void update(int x,int y){while(x>0){a[x]=a[x]+y;x=x-lowbit(x);}}int get(int x){int s=0;while(x<100000){s=s+a[x];x=x+lowbit(x);}return s;}int main(){int t,n,m,i,j,k;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));//memset(b,0,sizeof(b));scanf("%d%d",&n,&m);for(i=0;i<2*n+m;i++){scanf("%d",&s[i].num);s[i].ord=i+1;}sort(s,s+2*n+m,cmp);//if(s[0].ord<=2*n)c[s[0].ord]=1;for(i=1,j=1;i<2*n+m;i++){if(s[i].num!=s[i-1].num){j++;//if(s[i].ord<=2*n)c[s[i].ord]=j;}else{//if(s[i].ord<=2*n)c[s[i].ord]=j;}}for(i=1;i<2*n;i++){update(c[i+1],1);update(c[i]-1,-1);i++;}for(i=1;i<=m;i++){printf("%d\n",get(c[i+2*n]));}}return 0;}        


原创粉丝点击