比赛 收心赛 评测结果 AAAAAAAAAA
题目名称 卡牌游戏 最终得分 100
用户昵称 exil 运行时间 3.646 s
代码语言 C++ 内存使用 18.48 MiB
提交时间 2026-02-24 09:25:53
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
    int mian;
    int hao;
    int zhi;
};
node xu[2000005];
bool panduan[2000005]; 
bool cmp(node a,node b){
    return a.zhi<b.zhi;
}
signed main(){
    freopen("card.in","r",stdin);
    freopen("card.out","w",stdout); 
    int n,m;
    cin>>n>>m;
    for(int i =1;i<=n;i++){
        cin>>xu[i].zhi;
        xu[i].hao=i;
        xu[i].mian=1;//1表示正面 
    }
    for(int i =n+1;i<=n*2;i++){
        cin>>xu[i].zhi;
        xu[i].hao=i-n;
        xu[i].mian=0;//0表示反面 
    }
    sort(xu+1,xu+1+2*n,cmp);
    int ci=0;//当前已经翻的次数
    int l=1;
    while(l<=2*n){
        if(panduan[xu[l].hao]==0){
            if(xu[l].mian==1 && ci+1<=m){
                //若为正面(需翻),且还有次数可翻
                panduan[xu[l].hao]=1;
                ci++;
                l++; 
            }
            else if(xu[l].mian==0){
                //反面不管
                panduan[xu[l].hao]=1;
                l++; 
            }
            else break;
        }
        else break;//当r为2*n时,l能往右,使得方差变小的最右端找到了 
        
        
    }
    
    int r=2*n;
    while(r>=1){
        if(panduan[xu[r].hao]==0){
            if(xu[r].mian==1 && ci+1<=m){
                //若为正面(需翻),且还有次数可翻
                panduan[xu[r].hao]=1;
                ci++;
                r--; 
            }
            else if(xu[r].mian==0){
                //反面不管
                panduan[xu[r].hao]=1;
                r--; 
            }
            else break;
        }
        else break;//当l为最右端时,r能往左,使得方差变小的最左端找到了 
    }
    int ans=xu[r].zhi-xu[l].zhi;
    while(l>=1){//l逐步退回
        l--;
        if(panduan[xu[l].hao]==1)panduan[xu[l].hao]=0;
        if(xu[l].mian==1)ci--;
        
        while(r>=1){
            if(panduan[xu[r].hao]==0){
                if(xu[r].mian==1 && ci+1<=m){
                    panduan[xu[r].hao]=1;
                    ci++;
                    r--; 
                }
                else if(xu[r].mian==0){
                    panduan[xu[r].hao]=1;
                    r--; 
                }
                else break;
            }
            else break;
        }
        ans=min(ans,xu[r].zhi-xu[l].zhi);  
    }
    cout<<ans;
    return 0;
}