Gunner II
Time Limit: 20 Sec Memory Limit: 256 MB
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=5233
Description
很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上且离Jack最近的鸟儿就会落下来。 Jack会射击多次,他想知道每次射击哪只鸟儿会落下来。
Input
多组测试数据(大概5组),每一组的第一行给出n,m,n表示有n棵树和n只鸟,m表示Jack会射击m次。 在第二行,有n个整数h[1],h[2],h[3],…,h[n]表示这些树的高度。 在第三行,有m个整数,q[1],q[2],q[3],…,q[m]表示Jack射击的高度。 [参数约定] 所有输入均为整数。 1<=n,m<=100000(10^5) 1<=h[i],q[i]<=1000000000(10^9)
Output
对于每一个q[i],在一行中输出Jack射落的鸟的id。如果没有射中鸟儿,请输出-1。 (id 从1开始编号。)
Sample Input
5 5 1 2 3 4 1 1 3 1 4 2
Sample Output
1 3 5 4 2
HINT
题意
题解:
离散化离散化!
搞搞搞,就变成傻逼题了!
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 200001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; //const int inf=0x7fffffff; //нчоч╢С const int inf=0x3f3f3f3f; /* inline void P(int x) { Num=0;if(!x){putchar('0');puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } */ inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar('0');puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** struct node { int x,y; }; node h[maxn]; int q[maxn]; map<int,int> H; vector<int> k; vector<int> dp[maxn]; int cnt[maxn]; int main() { //freopen("test.txt","r",stdin); int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(h,0,sizeof(h)); memset(q,0,sizeof(q)); H.clear(); k.clear(); for(int i=0;i<maxn;i++) dp[i].clear(); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++) { h[i].x=read(); h[i].y=i+1; k.push_back(h[i].x); } for(int i=0;i<m;i++) { q[i]=read(); k.push_back(q[i]); } sort(k.begin(),k.end()); k.erase(unique(k.begin(),k.end()),k.end()); for(int i=0;i<k.size();i++) { H[k[i]]=i; } //cout<<endl; for(int i=0;i<n;i++) dp[H[h[i].x]].push_back(h[i].y); for(int i=0;i<m;i++) { if(cnt[H[q[i]]]>=dp[H[q[i]]].size()) { printf("-1\n"); } else { printf("%d\n",dp[H[q[i]]][cnt[H[q[i]]]]); cnt[H[q[i]]]++; } } } }