比赛 收心赛 评测结果 AAAAAAAAAT
题目名称 卡牌游戏 最终得分 90
用户昵称 123 运行时间 6.025 s
代码语言 C++ 内存使用 57.51 MiB
提交时间 2026-02-24 10:06:02
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10,K=22;
int n,m,a[N],b[N],mi[N],mx[N],qmx[N],st[N][K],lg[N];
set<int> s,t;
void init()
{
    for (int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
    for (int j=1;j<=20;j++)
    {
        for (int i=1;i+(1<<j)-1<=n;i++) st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
    }
}
int solve(int x,int y)
{
//    cout<<x<<" "<<y<<endl;
    if (x>y) return -1;
    int k=lg[y-x+1];
    return max(st[x][k],st[y-(1<<k)+1][k]);
}
int get(int i,int x)
{
    return max(n-(m-i)+1,max(x,i+1));
}
int main() {
    freopen("card.in","r",stdin);
    freopen("card.out","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n>>m;
    for (int i=1;i<=n;i++) cin>>a[i],s.insert(a[i]),mx[i]=max(mx[i-1],a[i]),st[i][0]=a[i];
    for (int i=1;i<=n;i++) cin>>b[i];
    init();
    mi[n]=b[n];qmx[n]=min(a[n],b[n]);
    for (int i=n-1;i>=1;i--) mi[i]=min(b[i],mi[i+1]),qmx[i]=max(qmx[i+1],min(a[i],b[i])); 
    int ans=1e9;
    for (int i=n;i>=n-m+1;i--)
    {
        auto it=s.end();it--;
        auto it1=s.begin();
        ans=min(ans,*it-*it1);
        s.erase(a[i]),s.insert(b[i]);
    }
    auto it=s.end();it--;
    auto it1=s.begin();
    ans=min(ans,*it-*it1);
    s.clear();
    for (int i=1;i<=n;i++) s.insert(a[i]);
    for (int i=1;i<=m;i++)
    {
        s.erase(a[i]),s.insert(b[i]),t.insert(b[i]);
        auto it=s.begin();
        int x=lower_bound(mi+1,mi+n+1,*it)-mi;
        if (x<=n)
        {
            auto it1=t.end();it1--;
//            cout<<"qwq "<<get(i,x)<<" "<<*it1<<" "<<solve(i+1,get(i,x)-1)<<" "<<qmx[get(i,x)]<<endl;
            ans=min(ans,max(max(*it1,solve(i+1,get(i,x)-1)),qmx[get(i,x)])-*it);
        }
//      cout<<ans<<endl;
    }
    cout<<ans;
}