5 5 1 2 3 4 1 1 3 1 4 2
1 3 5 4 2
用map<int,queue>会超时。还是老老实实地用数组吧。。。或者可以用map<int,int>离散化再对应queue<int>
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int N=1E5+5; struct mapp{ int h,p; }a[N]; int n,m,p,x,h[N],f[N]; int comp(const mapp&a,const mapp&b) { if (a.h==b.h) return a.p<b.p; return a.h<b.h; } int main() { while (cin>>n>>m) { for (int i=1;i<=n;i++) scanf("%d",&a[i].h),a[i].p=i; sort(a+1,a+n+1,comp); for (int i=1;i<=n;i++) f[i]=i,h[i]=a[i].h; //h[]以从小到大存高度,f[]能用到的部分表示每种高度的第一位置 for (int i=1;i<=m;i++) { scanf("%d",&x); p=lower_bound(h+1,h+n+1,x)-h; if (h[f[p]]!=x) { printf("-1\n"); continue; } printf("%d\n",a[f[p]].p); f[p]++; //由该高度的第一位置转到第二位置 } } return 0; }
或:
#include <stdio.h> #include <string.h> #include <queue> #include <map> #include <algorithm> using namespace std; typedef __int64 ll; const int maxn=100000+10; queue<int> que[maxn]; int main() { int i,n,j,m,t; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++) while(!que[i].empty()) que[i].pop(); map<int,int> mp; int cnt=1; for(i=1;i<=n;i++){ scanf("%d",&t); int tt=mp[t]; if(tt) que[tt].push(i); else { mp[t]=cnt++; que[cnt-1].push(i); } } while(m--){ scanf("%d",&t); int tt=mp[t]; if(que[tt].empty()) printf("-1\n"); else { printf("%d\n",que[tt].front()); que[tt].pop(); } } } return 0; }