数组84分求助!#3wa#4re求调!

P1102 A-B 数对

@[songwu_el](/user/822337) 用下标数据太大肯定会re,可以用哈希或者二分 ------------ ```cpp #define maxn 200010 #define ll long long int a[maxn],b[maxn]; int n,c; ll ans; //二分 int main() { scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]+c; } sort(b+1,b+n+1); /* lower_bound():返回大于或等于目标值的第一个位置 upper_bound():返回大于目标值的第一个位置 */ for(int i=1;i<=n;i++) { int x=a[i]; int l=lower_bound(b+1,b+n+1,x)-b; int r=upper_bound(b+1,b+n+1,x)-b; if(l!=r) ans+=r-l; } printf("%lld\n",ans); return 0; } //哈希 unordered_map<int,int> T; int main() { scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); T[a[i]]++; } for(int i=1;i<=n;i++) { ll x=a[i]-c; if(T.count(x)) ans+=T[x]; } printf("%lld\n",ans); return 0; } ```
by acheve_1k @ 2023-08-26 10:54:08


```cpp #include<bits/stdc++.h> using namespace std; const int N=2*1e5; int a[N+5]; int n; int find1(int num,int id){ int left=id+1,right=n; while(left<=right){ int mid=(left+right)/2; if(a[mid]>=num){ right=mid-1; } else if(a[mid]<num){ left=mid+1; } } return a[left]==num?left:0; } int find2(int num,int id){ int left=id+1,right=n; while(left<=right){ int mid=(left+right)/2; if(a[mid]>num){ right=mid-1; } else{ left=mid+1; } } return a[right]==num?right:0; } int main(){ int C; cin>>n>>C; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); int A,B; long long sum=0; for(int i=1;i<=n-1;i++){ B=a[i]; A=B+C; int sum1=find1(A,i); int sum2=find2(A,i); if(sum1!=0&&sum2!=0) sum+=sum2-sum1+1; } cout<<sum; return 0; } ```
by Yang_Yihang @ 2023-08-26 21:38:35


@[Yang_Yihang](/user/1012425) @[acheve_1k](/user/1050664) 谢谢两位大佬
by songwu_el @ 2023-08-27 09:32:11


|