HDU5233 Gunner II && BestCoder Round #42

来源:互联网 发布:tor网络原理 编辑:程序博客网 时间:2024/05/21 07:46

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5233

解题思路:

先对数据进行离散化,把数字转化到0n1的区间内。然后对每一种数字串起来按照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;}


0 0
原创粉丝点击