想看最终代码请直接翻到最下面。
标签:
二分
二分??
这确定需要二分吗?
题目传送门!
已经一年没学编程的我看见二分一头雾水(学c++第10章也迟迟没更新qwq,泪目)
但是爱耍小聪明的我一眼就能看出,这不用二分也能做啊!
题目要求输入数字,在
a
i
a_i
ai里面找出。众所周知
a
i
a_i
ai是需要输入的,所以在输入过程中,我们把一个数字第一次出现的编号记录下来,这样就不用二分了!
这里用的是桶思想,虽然和桶有些不同
第一次代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a,q;
int b[100001]={0};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a;
if(b[a]==0)b[a]=i;
}
for(int i=1;i<=m;i++){
cin>>q;
if(b[q]==0)cout<<-1<<' ';
else cout<<b[q]<<' ';
}
return 0;
}
提交一看,全部RE!!!
经过大佬一番指点后,我做出了第二次代码,原因是B数组开小了
第二次代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a,q;
int b[1000000001]={0};
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a;
if(b[a]==0)b[a]=i;
}
for(int i=1;i<=m;i++){
cin>>q;
if(b[q]==0)cout<<-1<<' ';
else cout<<b[q]<<' ';
}
return 0;
}
提交一看,编译失败!!!
原因是数组太大了
但是开小了又怕RE
怎么办?怎么办?难道这个办法就此陨落了吗?
经过大佬一番指点后,我终于知道了解决办法:改用map
map可以指定两个类型,一个是键,一个是值。这里键值都是int,就写map<int,int>
最终代码!!!
#include<bits/stdc++.h>
using namespace std;
int n,m,a,q;
map<int,int>b;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a;
if(b[a]==0)b[a]=i;
}
for(int i=1;i<=m;i++){
cin>>q;
if(b[q]==0)cout<<-1<<' ';
else cout<<b[q]<<' ';
}
return 0;
}