求卡常
  • 板块灌水区
  • 楼主Lawrence003
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/11/10 16:16
  • 上次更新2024/11/10 16:53:10
查看原帖
求卡常
778881
Lawrence003楼主2024/11/10 16:16

赛时就T了

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn (int)2e5
#define INF (long long)1e18
long long n,m,L,R;
long long a[maxn+100],b[maxn+100],p[maxn+10];
priority_queue<pair<long long,pair<int,int>>,vector<pair<long long,pair<int,int>>>,greater<pair<long long,pair<int,int>>>>q;
long long get(long long x)
{
    long long cnt=0;
    for(int i=0;i<n;i++)
    {
        p[i]=upper_bound(b,b+n,x-a[i])-b;
        cnt+=p[i];
    }
    return cnt;
}
int main()
{
    scanf("%lld%lld%lld",&n,&L,&R);
    for(int i=0;i<n;i++)scanf("%lld",&a[i]);
    for(int i=0;i<n;i++)scanf("%lld",&b[i]);
    sort(b,b+n);
    long long l=0,r=INF,ans=-1;
    while(l<=r)
    {
        long long mid=(l+r)/2;
        if(get(mid)>=L)
        {
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    long long cnt=get(ans);
    for(int i=0;i<min(R,cnt)-L+1;i++)printf("%lld ",ans);
    for(int i=0;i<n;i++)q.push({a[i]+b[p[i]],{i,p[i]}});
    for(int i=cnt+1;i<=R;i++)
    {
        pair<long long,pair<int,int>>u=q.top();
        printf("%lld ",u.first);
        q.pop();
        if(u.second.second<n-1)q.push({a[u.second.first]+b[u.second.second+1],{u.second.first,u.second.second+1}});
    }
    printf("\n");
    return 0;
}
2024/11/10 16:16
加载中...