注意:二分起始节点不是a+1,而是a+i+1
可以倒叙循环,一旦找不到可匹配的人就直接输出答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[200005]; int main(void) { int i,n,s; long long tot=0; scanf("%d%d",&n,&s); for(i=1;i<=n;++i)scanf("%lld",&a[i]); sort(a+1,a+n+1); for(i=n-1;i>=1;--i) { int* t=upper_bound(a+i+1,a+n+1,s-a[i]); if(t==a+n+1)break; tot+=a+n+1-t; } printf("%lld\n",tot); return 0; }
|