题目链接:
题意:
n棵树依次排好,每棵树都有一个高度,树的顶端有一只鸟。
猎人会打M枪,每一枪都能从高度为X的树上打下一只鸟,问每一枪打下的鸟是从 编号多少的树 上掉下来的
题解思路:
因为树的高度能达到(10^9) 而树的数量最多10^5 所以离散化 将所有高度为X的树离散化为 高度为第X高的树
有多种方法。
1 stl去重+set版:
#include<iostream> #include<cstdio> #include<cstring> #include<set> #include<algorithm> #define MAXN 100050 using 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 100010 struct 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 100005 using 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/6882660 int 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; } } } }
时间: 2024-10-26 01:02:24