标签:二分
5 5 1 2 3 4 1 1 3 1 4 2
1 3 5 4 2这道题因为删除方法不对,一直T,终于改用vis后,900多ms水过去了。。#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; struct node{ int id,num; }a[100006]; int n,vis[100006]; bool cmp(node a,node b){ if(a.num==b.num)return a.id>b.id; return a.num<b.num; } int q[100006]; int find(int x,int l,int r) { int mid,j; while(l<=r) { mid=(l+r)/2; if(a[mid].num==x)break; if(a[mid].num>x)r=mid-1; else l=mid+1; } j=mid; if(vis[j]==1){ j--; while(1){ if(vis[j]==0)break; j--; } return j; } else{ j++; while(1){ if(j>n || vis[j]==1 || a[j].num>x){ j--;break; } j++; } return j; } } int main() { int m,i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { map<int,int>hash; hash.clear(); for(i=1;i<=n;i++){ vis[i]=0; scanf("%d",&a[i].num); a[i].id=i; hash[a[i].num]++; } sort(a+1,a+1+n,cmp); for(i=1;i<=m;i++){ scanf("%d",&q[i]); if(hash[q[i]]==0){ printf("-1\n");continue; } else{ hash[q[i]]--; j=find(q[i],1,n); vis[j]=1; printf("%d\n",a[j].id); } } } return 0; }
标签:二分
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46430383