题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5233
解题思路:
先对数据进行离散化,把数字转化到 0 到 n−1 的区间内。然后对每一种数字串起来按照ID从小到大。可以用链表,或者Vector。 查询的时候要注意如果没有把查询一起离散化的话要先判断一下数字是否可以找得到。 找到之后按照下标去对应的数字串中找出第一个即可。然后删除。如果数字串中没有数字了就应该输出 −1 。 空间复杂度是 O(n) ,时间复杂度是 nlogn+Qlogn
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m;
int p[100005];
struct node
{
int a,b,vis;
}v[100005];
bool cmp(node x,node y)
{
if(x.b == y.b)
return x.a<y.a;
return x.b<y.b;
}
int bitfind(int l,int r,int x)
{
if(l == r)
{
if(v[l].b==x && !v[l].vis)
{
v[l].vis=1;
return v[l].a;
}
else
return -1;
}
int mid=(l+r)>>1;
if(v[mid].b<x || (v[mid].b==x && v[mid].vis))
return bitfind(mid+1,r,x);
else
return bitfind(l,mid,x);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,x,ans=0;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
v[i].a=i;
v[i].b=x;
v[i].vis=0;
}
sort(v+1,v+n+1,cmp);
for(j=1;j<=m;j++)
{
scanf("%d",&x);
int tmp=bitfind(1,n,x);
p[ans++]=tmp;
}
for(i=0;i<ans;i++)
printf("%d\n",p[i]);
}
return 0;
}