2 条题解

  • 0
    @ 2024-4-18 13:57:46

    直接二分(doge)(其实是懒得处理重复的问题doge)

    #include<bits/stdc++.h>
    #define M 200010
    using namespace std;
    int n,c;
    long long ans=0;
    int num[M];
    int main(){
    	scanf("%d %d",&n,&c);
    	for(int i=0;i<n;++i) scanf("%d",&num[i]);
    	sort(num,num+n);
    	int mid=0;
    	for(int i=n-1;i>=0;--i){
    		int l=0,r=n-1;
    		while(l<=r){
    			mid=(l+r)>>1;
    			if(num[i]-num[mid]>c)l=mid+1;
    			else r=mid-1;
    		}
    		int nmid,ll=0,rr=n-1;
    		while(ll<=rr){
    			nmid=ll+((rr-ll)>>1);
    			if(num[i]-num[nmid]<c)rr=nmid-1;
    			else ll=nmid+1;
    		}
    		ans+=ll-l;
    	}
    	printf("%lld",ans);
    	return 0;
    }
    

    信息

    ID
    239
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    22
    已通过
    12
    上传者