G2. Dances (Hard Version)
题解
先贪心地令 \(a\) 与 \(b\) 配对,设最大的没有配对到的 \(b\) 为 \(k\)
为什么?因为这样保证了留给 \(m\) 的 \(b\) 是最大的,且原本数组的配对数量也是最优的
接下来 \(m\) 中所有小于 \(k\) 的部分可以直接与 \(k\) 配对
为什么?因为 \(m\) 与更小的配对显然不优,与更大的配对会导致原数组的配对数可能不变 ,可能减一,m轮下来会减m,并不更优
code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100005],b[100005];
int main()
{
    ll t;
    cin>>t;
    while(t--)
    {
        ll n,m;
        cin>>n>>m;
        for(ll i=1;i<n;i++) cin>>a[i];
        for(ll i=1;i<=n;i++) cin>>b[i];
        sort(a+1,a+n);
        sort(b+1,b+1+n);
        ll it=1;
        ll cnt=0,maxs=b[n];
        for(ll i=1;i<n;i++)
        {
            while(it<=n&&b[it]<=a[i])
            {
                maxs=b[it];
                it++;
            }
            if(it>n) break;
            cnt++;
            it++;
        }
        //printf("cnt:%d  maxs:%d\n",cnt,maxs);
        ll ans=(n-1LL-cnt)*m;
        if(m>=maxs) ans+=m-maxs+1LL;
        cout<<ans<<endl;
    }
    return 0;
}
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号