HDU5233 Gunner II 离散化的各种方法

来源:互联网 发布:天津网络危机公关公司 编辑:程序博客网 时间:2024/05/21 22:57

题目链接:

HDU5233




题意:

n棵树依次排好,每棵树都有一个高度,树的顶端有一只鸟。

猎人会打M枪,每一枪都能从高度为X的树上打下一只鸟,问每一枪打下的鸟是从  编号多少的树 上掉下来的




题解思路:

因为树的高度能达到(10^9)  而树的数量最多10^5  所以离散化   将所有高度为X的树离散化为 高度为第X高的树

有多种方法。



1  stl去重+set版:

#include<iostream>#include<cstdio>#include<cstring>#include<set>#include<algorithm>#define MAXN  100050using namespace std;int h[MAXN];int q[MAXN];int s[MAXN*2];set<int>ans[MAXN*2];int main(){    int n,m,cnt;    while(~scanf("%d%d",&n,&m))    {        cnt=0;        for(int i=0;i<n;i++)        {            scanf("%d",&h[i]);            s[cnt++]=h[i];        }        for(int j=0;j<m;j++)        {            scanf("%d",&q[j]);            s[cnt++]=q[j];        }        sort(s,s+cnt);        cnt=unique(s,s+cnt)-s;        for(int i=0;i<cnt;i++)            ans[i].clear();        for(int i=0;i<n;i++)        {            int d=lower_bound(s,s+cnt,h[i])-s;            ans[d].insert(i+1);        }        for(int j=0;j<m;j++)        {            int d=lower_bound(s,s+cnt,q[j])-s;            if(ans[d].empty())                printf("-1\n");            else            {                printf("%d\n",*ans[d].begin());                ans[d].erase(ans[d].begin());            }        }    }    return 0;}



土方法离散:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define maxn  100010struct H{    int v,id;}num[2*maxn];int w[2*maxn];int vis[maxn<<1];bool cmp(H a,H b){    return a.v<b.v;}vector <int> vc[maxn<<1];int main(){    int n,m;    int cnt;    while(~scanf("%d%d",&n,&m)){        cnt=0;        for(int i=0;i<n;i++)        {            int xx;            scanf("%d",&xx);            num[i].v=xx;num[i].id=i;        }        for(int i=n;i<n+m;i++)        {            int xx;scanf("%d",&xx);            num[i].v=xx;num[i].id=i;        }        sort(num,num+n+m,cmp);        int tot=0;w[num[0].id]=0;        for(int i=1;i<n+m;i++)        {            if(num[i].v==num[i-1].v){                w[num[i].id]=tot;            }            else w[num[i].id]=++tot;        }        memset(vis,0,sizeof(vis));        for(int i=0;i<n;i++)        {            vis[w[i]]++;vc[w[i]].push_back(i+1);        }        for(int i=n;i<n+m;i++)        {            if(vis[w[i]]>0)            {                int le=vc[w[i]].size()-vis[w[i]];                printf("%d\n",vc[w[i]][le]);                vis[w[i]]--;            }            else printf("-1\n");        }    }    return 0;}


set+map:

#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <algorithm>#define read freopen("q.in","r",stdin)#define LL long long#define maxn 100005using namespace std;set<int>  mp[maxn];map<int,int> c;//http://www.2cto.com/kf/201108/100912.html//http://blog.csdn.net/tyzhaoqi2004/article/details/6882660int main(){    //read;   int n,m;   while(scanf("%d%d",&n,&m)!=EOF)   {       int i,j,q,x,t=0;       for(i=1;i<=n;i++)        mp[i].clear();        c.clear();       for(i=0;i<n;i++)       {          scanf("%d",&x);          if(!c[x])c[x]=++t;          mp[c[x]].insert(i+1);         // cout<<c[x]<<" ";       }       //for(i=1;i<=t;i++)cout<<c[i]<<" ";    //   cout<<endl;       for(i=0;i<m;i++)       {          scanf("%d",&q);          if(mp[c[q]].size()==0)          {             printf("-1\n");          }          else          {            //  cout<<mp[q].size()<<" %% "<<endl;             printf("%d\n",*(mp[c[q]].begin()));             mp[c[q]].erase(mp[c[q]].begin());            // cout<<mp[q].size()<<" %% "<<endl;          }       }    }}






0 0
原创粉丝点击