二分
1.三足鼎立
来源:题目来源
错误的原因:
最开始想的就是通过二分来操作算出上下界,然后计算长度,可惜lower_bound和upper_bound不是很会用,就没做出来,然后自己手写的二分的模板已经忘得差不多了
代码:
点击查看代码
#include<bits/stdc++.h>
#define INF 2e5+1
#define ll long long
using namespace std;
void solve(){
int n,k;
cin>>n>>k;
vector<int>a(n);
for(int i=0;i<n;i++)cin>>a[i];
sort(a.begin(),a.end());
ll ans=0;
for(int i=0;i+1<n;i++){
int most=a[i]+k;
int least;
if(a[i]>=k){
least=a[i]-k;
}
else{
least=k-a[i];
}
ll l=upper_bound(a.begin()+1+i,a.end(),least)-a.begin();
ll r=lower_bound(a.begin()+1+i,a.end(),most)-a.begin();
ans+=max(0ll,r-l);
}
cout<<ans;
}
int main(){
int t;
// cin>>t;
t=1;
while(t--){
solve();
}
}
浙公网安备 33010602011771号