2.3.4超时,请教大佬们如何优化代码的时间复杂度

P1102 A-B 数对

Cu Ball TLE on #2 #3 ```cpp #include<cstdio> #include<algorithm> using namespace std; int bs(int a[],int n,int x){ int low=1,high=n,mid; while(low<=high){ mid=(low+high)/2; if(x==a[mid]) return mid; else if(x<a[mid]) high=mid-1; else low=mid+1; } return -1; } int cnt(int a[],int n,int x){ int ans=0; for(int i=1;i<=n;i++){ if(a[i]==x) ans++; } return ans; } int main(){ int ans=0,n,c,s[200001]; scanf("%d%d",&n,&c); for(int i=1;i<=n;i++){ scanf("%d",&s[i]); } sort(s+1,s+n+1); for(int i=1;i<=n;i++){ if(bs(s,n,s[i]-c)!=-1) ans+=cnt(s,n,s[i]-c); } printf("%d",ans); return 0; } ```
by _TCR_ @ 2024-03-25 18:21:56


@[bu_chi_suan](/user/1314163) `//对得到的数组从小到大排序 ` $\Theta(n^2)$
by XuYueming @ 2024-03-25 18:23:01


@[_TCR_](/user/483466) @[bu_chi_suan](/user/1314163) 二分的统计是 $\Theta(n)$ 的,为何每次都要扫一遍统计次数?
by XuYueming @ 2024-03-25 18:24:33


@[XuYueming](/user/728079) 大佬,cnt放在在那个二分函数中和放到函数外,花费的时间不一样吗?我想的就是每次调用二分函数找到后就进行一次统计
by bu_chi_suan @ 2024-03-25 18:31:19


@[_TCR_](/user/483466) 感谢你的代码,我把冒泡排序改成sort后2,3不会超时了,但4依然超时
by bu_chi_suan @ 2024-03-25 18:40:56


~~这道题有那么难吗???~~ **勿抄** ``` #include <bits/stdc++.h> int a[200010], n, c; long long ans = 0; using namespace std; int findx(int k) { // 找到第一次出现的位置 int l = 1, r = n, ans = -1; while (l <= r) { int mid = (r+l)/2; if (a[mid]==k) { // 如果中间的数字等于要找的 ans=mid; // 记录答案位置 r=mid-1; // 局限在左区间 } else if ( a[mid]>k) // 如果中间数字大于要找的 r=mid-1; // 局限在左区间 else // 如果中间数字小于于要找的 l=mid+1; // 局限在右区间 } return ans; } int findy(int k) { // 找到第一次出现的位置 int l = 1, r = n, ans = -1; while (l <= r) { int mid = (r+l)/2; if (a[mid]==k) { // 如果中间的数字等于要找的 ans=mid; // 记录答案位置 l=mid+1; // 局限在左区间 } else if ( a[mid]>k) // 如果中间数字大于要找的 r=mid-1; // 局限在左区间 else // 如果中间数字小于于要找的 l=mid+1; // 局限在右区间 } return ans; } int main() { cin >> n >> c; for(int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + n + 1); for(int i = 1; i <= n; i++) { int x = findx(a[i] + c); int y = findy(a[i] + c); if(x == -1) continue; ans += y-x+1; } cout << ans; // __输出答案 } ```
by HAha201205221633 @ 2024-03-25 18:47:30


@[HAha201205221633](/user/892365) 大佬,谢谢!我没想到可以直接分别找到首个和最后一个,直接就找到首个后遍历找个数了
by bu_chi_suan @ 2024-03-25 19:35:32


|