2 条题解
-
1
这道题好像因为题面过于简单误导大家了,如果以后遇到TLE且没有新思路的话,建议先跳过,很可能是卡某些算法。
这道题的正解应该是两遍二分,把每个 ai 作为减数,对应的被减数应该是唯一的,第一遍二分找第一次出现的被减数,第二遍找最后一次出现的被减数,可得到答案。时间复杂度应该是O(nlogn)。有人用桶的方式过了,其实是因为数据没有给到特别大,还是建议大家优先使用二分,这里不再赘述。
#include<bits/stdc++.h> #define int long long using namespace std; signed main() { int n,k; cin >> n >> k; int ai[n+5]={0}; for(int i=1;i<=n;i++) { cin >> ai[i]; } int sum=0; for(int i=1;i<=n;i++) { int tar=ai[i]+k; int l=i-1,r=n+1; while(l+1!=r) { int mid=(l+r)/2; if(ai[mid]<tar) { l=mid; } else { r=mid; } } int ll=i-1,rr=n+1; while(ll+1!=rr) { int mid=(ll+rr)/2; if(ai[mid]>tar) { rr=mid; } else { ll=mid; } } sum+=(ll-r+1); } cout << sum << endl; }
信息
- ID
- 1153
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 354
- 已通过
- 23
- 上传者