双指针
复杂度O(n+m)
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int main(){
int n,m,x;
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
for(int i=0,j=m-1;i<n;i++){
while(j>=0&&a[i]+b[j]>x)j--;
if(a[i]+b[j]==x){
cout<<i<<' '<<j;
break;
}
}
}
二分法
复杂度O(n+m)
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int n,m,x;
int sort(int l,int r,int b[],int t){
if(l>=r)
return 0;
while(l<r){
int mid=l+r>>1;
if(b[mid]>=t)r=mid;
else l=mid+1;
}
return l;
}
int main(){
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
for(int i=0;i<n;i++){
int p=sort(0,m-1,b,x-a[i]);
if(a[i]+b[p]==x){
cout<<i<<' '<<p;
break;
}
}
}