比赛 收心赛 评测结果 AAAAAATTTT
题目名称 卡牌游戏 最终得分 60
用户昵称 KKZH 运行时间 8.786 s
代码语言 C++ 内存使用 16.06 MiB
提交时间 2026-02-24 10:33:47
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10; 
int n,m,fmn[N],bmx[N],bmn[N],fmx[N],mx,mn,ans=INT_MAX;
struct node{
    int up,down;
}a[N];
bool cmp(node a,node b){
    return a.up<b.up;
}
int main(){
	freopen("card.in","r",stdin);
	freopen("card.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	memset(fmn,0x3f,sizeof(fmn));
	memset(bmn,0x3f,sizeof(bmn));
	for(int i=1;i<=n;i++) cin>>a[i].up;
	for(int i=1;i<=n;i++) cin>>a[i].down;
//	if(n-m<m){
//	    m=n-m;
//	    for(int i=1;i<=n;i++) swap(a[i].up,a[i].down);
//    }
	sort(a+1,a+1+n,cmp);
	fmn[1]=a[1].down;
	fmx[1]=a[1].down;
	for(int i=2;i<=n;i++) fmn[i]=min(fmn[i-1],a[i].down),fmx[i]=max(fmx[i-1],a[i].down);
	bmx[n]=a[n].down;
	bmn[n]=a[n].down;
	for(int i=n-1;i>=1;i--) bmx[i]=max(bmx[i+1],a[i].down),bmn[i]=min(bmn[i+1],a[i].down);
	for(int i=1;i<=n;i++){
	    if(a[i].up>a[i].down){
	        mx=i;
	        break;
        }
    }
    for(int i=n;i>=1;i--){
        if(a[i].up<a[i].down){
            mn=i;
            break;
        }
    }
//    for(int i=1;i<=n;i++) cout<<bmn[i]<" ";
//    cout<<mn<<" "<<mx<<endl;
    ans=a[n].up-a[1].up;
    m=min(m,n-mn+mx-1);
    for(int mm=1;mm<=m;mm++)
    for(int i=max(0,mm-n+mn);i<=min(mm,mx-1);i++){
        int resn=fmn[i],resx=bmx[n-mm+i+1];
//        cout<<i<<" "<<n-m+i+1<<endl;
        if(i==0) resn=INT_MAX;
        resn=min(bmn[n-mm+i+1],resn);
        resx=max(resx,fmx[i]);
        if(i+1!=n-mm+i+1){
            if(i<n)
                resn=min(resn,a[i+1].up);
            if(n-m+i>0)
                resx=max(resx,a[n-mm+i].up);
        }
//        cout<<i<<" "<<resn<<" "<<resx<<endl;
        ans=min(ans,resx-resn);
    }
    cout<<ans;
	return 0;
}