比赛 果蝇王邀请赛div2 评测结果 AAWWWWWWWWWWWWWWWWWW
题目名称 果蝇诱饵 最终得分 10
用户昵称 x123456 运行时间 1.514 s
代码语言 C++ 内存使用 5.75 MiB
提交时间 2026-08-27 11:11:43
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct no{
    int a,b,idx;
}c[200005];
bool cmp(no a,no b){
    return a.b<b.b;
}
int t,n;
ll k,l,a[200005];
void solve1(){
    ll x,ans=0;
    scanf("%lld",&x);
    ans+=max(x,l-x);
    ans+=(k-1)*l;
    printf("%lld\n",ans);
}
void solve2(){
    ll x,y,ans=0,cnt=0;
    scanf("%lld%lld",&x,&y);
    ans+=(y-x)/2;
    k--;
    if(k==0)printf("%lld\n",ans);
    ans+=max(x+(y-x)/2,l-(x+(y-x)/2));
    k--;
    if(k==0)printf("%lld\n",ans);
    ans+=l*k;
    printf("%lld\n",ans);
}
int main(){
    freopen("fly.in","r",stdin);
    freopen("fly.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        ll ans=0,s,e;
        scanf("%d%lld%lld",&n,&k,&l);
        if(n==1){
            solve1();
            continue;
        }
        else if(n==2){
            solve2();
            continue;
        }
        for(int i=1;i<=n;i++)c[i]={0,0,0};
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        sort(a+1,a+1+n);
        s=a[1];
        c[1].a=a[2];
        c[1].b=c[1].a-s;
        c[1].idx=1;
        for(int i=2;i<=n-1;i++){
            c[i].a=a[i+1];
            c[i].b=c[i].a-c[i-1].a;
            c[i].idx=i;
        }
        e=c[n-1].a;
        sort(c+1,c+n,cmp);
        int cnt=0;
        for(int i=n-1;i;i--){
            ans+=c[i].b/2;
            s+=c[i].b/2;
            e-=c[i].b/2;
            if(c[i].idx>c[1].idx){
               c[1].a+=c[i].b/2;
            }
            else if(c[i].idx<=c[1].idx){
                c[1].a-=c[i].b/2;
            }
            cnt++;
            if(cnt==k)break;
        }
        ll en=c[1].a;
        if(cnt==k){
            printf("%lld\n",ans);
            continue;
        }
        else{
            cnt++;
            ans+=max(e,l-e);
            ans+=l*(k-cnt);
            printf("%lld\n",ans);
        }
    }
    return 0;
}