第一份代码为什么错了?(WA on#16)
查看原帖
第一份代码为什么错了?(WA on#16)
591138
Hide_In_The_Shadow楼主2024/8/13 14:30

一.(WA on#16)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
template<typename T>inline void read(T &x){
	x=0;
	char c=getchar();
	T ret=0;
	while(!isdigit(c))ret|=!(c^'-'),c=getchar();
	while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
	if(ret)x=(~x)+1;
	return;
}
template<typename T>inline void print(T x){
	if(x<0)putchar('-'),x=(~x)+1;
	if(x>9)print(x/10);
	putchar((x-x/10*10)^48);
	return;
}
template<typename T>inline void wr1(T x){
	print(x);
	putchar(' ');
	return;
}
template<typename T>inline void wr2(T x){
	print(x);
	putchar('\n');
	return;
}
ll n,q,a[114514],b,k;
bool chek(ll dis){
    ll l=1,r=n,sum=0;
    while(l<r){//查找序列中第一个>=b-dis的位置
        ll mid=(l+r)>>1;
        if(b-a[mid]<=dis){
            r=mid;
        }
        else{
            l=mid+1;
        }
    }
    sum+=1-l;
    l=1,r=n;
    while(l<r){//查找序列中第一个<=b+dis的位置
        ll mid=(l+r+1)>>1;
        if(a[mid]-b<=dis){
            l=mid;
        }
        else{
            r=mid-1;
        }
    }
    sum+=l;
    return sum>=k;
}
ll work(){
    ll l=0,r=2e8+10;
    while(l<r){
        ll mid=(l+r)>>1;
        if(chek(mid)){
            r=mid;
        }
        else{
            l=mid+1;
        }
    }
    return l;
}
int main(){
    read(n);
    read(q);
    for(int i=1;i<=n;++i){
        read(a[i]);
    }
    sort(a+1,a+n+1);
    while(q--){
        read(b);
        read(k);
        wr2(work());
    }
	return 0;
}

二.(AC)

// LUOGU_RID: 172377347
#include<bits/stdc++.h>
#define ll long long
using namespace std;
template<typename T>inline void read(T &x){
	x=0;
	char c=getchar();
	T ret=0;
	while(!isdigit(c))ret|=!(c^'-'),c=getchar();
	while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
	if(ret)x=(~x)+1;
	return;
}
template<typename T>inline void print(T x){
	if(x<0)putchar('-'),x=(~x)+1;
	if(x>9)print(x/10);
	putchar((x-x/10*10)^48);
	return;
}
template<typename T>inline void wr1(T x){
	print(x);
	putchar(' ');
	return;
}
template<typename T>inline void wr2(T x){
	print(x);
	putchar('\n');
	return;
}
ll n,q,a[114514],b,k;
bool chek(ll dis){
    ll l,r;
    r=upper_bound(a+1,a+n+1,b+dis)-a-1;//第一个>b-dis的
    l=lower_bound(a+1,a+n+1,b-dis)-a-1;//第一个>=b-dis的
    return r-l>=k;
}
ll work(){
    ll l=0,r=2e8+10;
    while(l<r){
        ll mid=(l+r)>>1;
        if(chek(mid)){
            r=mid;
        }
        else{
            l=mid+1;
        }
    }
    return l;
}
int main(){
    read(n);
    read(q);
    for(int i=1;i<=n;++i){
        read(a[i]);
    }
    sort(a+1,a+n+1);
    while(q--){
        read(b);
        read(k);
        wr2(work());
    }
	return 0;
}

2024/8/13 14:30
加载中...