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号