92分代码改坏了;求好哥哥www
查看原帖
92分代码改坏了;求好哥哥www
772749
METEOIRITE楼主2022/12/17 19:32
#include<iostream>
#include<algorithm>

const int maxn = 1000005;
int num[maxn];
int N,C;


auto er_fen =[](int left,int right,int key)->int {
    int mid =(left+right)/2;
    while(left<right)
    {
        if(num[mid]>=key){
            right=mid;
            mid=(left+right)/2;
        }
        if(num[mid]<key){
            left=mid+1;
            mid=(left+right)/2;
        }

    }
    if(num[left]==key) return left;
    else return -1;
};

auto er_fen_2 =[](int left,int right,int key)->int {
    int mid =(left+right)/2;
    while(left<right)
    {
        if(num[mid]>key){
            right=mid;
            mid=(left+right)/2;
        }
        if(num[mid]<=key){
            left=mid;
            mid=(left+right)/2;
        }

    }
    if(num[left]==key) return left;
    else return -1;
};

int main()
{
    int cnt_ = 0;
    std::cin>>N>>C;
    for(int i=1;i<=N;i++){
        std::cin>>num[i];
    }
    std::sort(num+1,num+N+1);
    for(int i=1;i<=N;i++){
        int key_= num[i]-C;
        auto pos_1=er_fen(1,N,key_);
        if(pos_1 !=-1 ){
            auto pos_2=er_fen_2(1,N,key_);
            cnt_+=pos_2-pos_1+1;
        }       
    }
    std::cout<<cnt_<<std::endl;
    return 0;
}

具体就是二分找左端点再找右端点然后cnt_加上有多少值

2022/12/17 19:32
加载中...