在实中夏令营上做的题
原题
AC代码
由于要求给出数字第一次出现位置
纯二分是不行的
查出这个数再一步步向前查找会wa一个点tle一个点
所以我干脆在输入时使用结构体把每个数第一次出现位置记下来,到时候线性查找
此思路AC(看你谷几个热门题解都没有涉及结构体,干脆自己发一篇
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,q; 4 struct node{ 5 int vail,fir; 6 }sum[1000005]; 7 int erfen(int l,int r,int q){ 8 while(l<=r){ 9 int mid=(l+r)/2; 10 if(sum[mid].vail==q){ 11 return sum[mid].fir; 12 } 13 if(sum[mid].vail<q){ 14 l=mid+1; 15 } 16 if(sum[mid].vail>q){ 17 r=mid-1; 18 } 19 } 20 return -1; 21 } 22 int main(){ 23 scanf("%d%d",&n,&m); 24 for(int i=1;i<=n;i++){ 25 scanf("%d",&sum[i].vail); 26 if(sum[i].vail==sum[i-1].vail&&i>1)sum[i].fir=sum[i-1].fir; 27 else sum[i].fir=i; 28 } 29 while(m--){ 30 scanf("%d",&q); 31 printf("%d ",erfen(1,n,q)); 32 } 33 return 0; 34 }