Codeforces 600B Queries about less or equal elements(二分查找)
题意:找出a数组中比b数组中每个数小或者相等的数的个数
题解:c++中的upper_bound(a,a+n,k)返回的就是第一个大于k的位置指针(a按照升序排列)如果a按照降序排列则是第一个小于k的位置指针
lower_bound(a,a+n,k)返回的就是第一个大于等于k的位置指针(a按照升序排列)如果a按照降序排列则是第一个小于等于k的位置指针
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #define MAX 200100 using namespace std; int a[MAX],b[MAX]; int c[MAX],d[MAX]; int main() { int n,m,j,i; int s; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<m;i++) scanf("%d",&b[i]); sort(a,a+n); for(i=0;i<m;i++) { if(i==m-1) printf("%d\n",upper_bound(a,a+n,b[i])-a); else printf("%d ",upper_bound(a,a+n,b[i])-a); } // __int64 Max=-1; // memset(a,0,sizeof(0)); // memset(b,0,sizeof(b)); // memset(d,0,sizeof(d)); // for(i=1;i<=n;i++) // { // scanf("%I64d",&s); // if(s>0) // d[s]++; // a[s]=s; // Max=max(Max,s); // } // for(i=1;i<=m;i++) // { // scanf("%I64d",&s); // b[i]=s; // } // for(i=1;i<=Max;i++) // { // if(a[i]==0) // a[i]=i+1; // } // sort(a,a+n); // memset(c,0,sizeof(c)); // for(i=1;i<=Max;i++) // { // if(a[i]<=i) // c[i]+=(c[i-1]+d[i]); // else // c[i]=c[i-1]; // } // for(i=1;i<m;i++) // printf("%I64d ",c[b[i]]); // printf("%I64d\n",c[b[m]]); } return 0; }