qiutiao
  • 板块学术版
  • 楼主mystic_qwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/22 22:23
  • 上次更新2025/1/23 10:12:12
查看原帖
qiutiao
246331
mystic_qwq楼主2025/1/22 22:23

d

link

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define F(i,x,y) for(int i=x;i<=y;++i)
const int N=2e5+10;
int T,n,m,a[2][N],kmax;
void solve()
{
  kmax=0; F(i,1,max(n,m)) a[0][i]=a[1][i]=0;
  cin>>n>>m; F(i,1,n) cin>>a[0][i]; F(i,1,m) cin>>a[1][i];
  int vmin=n<m?n:m,vmax=n<m?m:n;
  while(vmax>=2&&vmin>=1)
  {
    vmax-=2,--vmin,++kmax;
    tie(vmin,vmax)=minmax(vmin,vmax);
  }
  cout<<kmax<<'\n';
  vector<pii> ch[2];
  multiset<int> p[2];
  F(i,1,n) p[0].insert(a[0][i]);
  F(j,1,m) p[1].insert(a[1][j]);
  
  int tomin=n<m?0:1,d0=0,d1=0,ans=0;
  F(i,1,kmax) 
  {
    // tomax: tomin^1
    #define all \
    int a=p[0].size()>d0?*p[0].rbegin()-*p[0].begin():0;  \
    int b=p[1].size()>d1?*p[1].rbegin()-*p[1].begin():0;  \
    if(a>b&&b) {                                          \
      int x=*p[0].rbegin(),y=*p[0].begin();               \
      p[0].erase(x),p[0].erase(y);                        \
      ch[0].pb({x,y}),++d1,ans+=x-y;                      \
    } else if(b>a&&a) {                                   \
      int x=*p[1].rbegin(),y=*p[1].begin();               \
      p[1].erase(x),p[1].erase(y);                        \
      ch[1].pb({x,y}),++d0,ans+=x-y;                      \
    } 
    all
    else {
      tomin=(int)p[0].size()-d0<(int)p[1].size()-d1?0:1;
      auto[x,y]=ch[tomin].back();ch[tomin].pop_back(); ans-=x-y,tomin?--d0:(--d1); p[tomin].insert(x),p[tomin].insert(y);
      int a1=*p[tomin^1].rbegin(),b1=*p[tomin^1].begin();
      ans+=a1-b1,tomin?++d1:(++d0); p[tomin^1].erase(a1); p[tomin^1].erase(b1); ch[tomin^1].pb({a1,b1});
      all
    }
    cout<<ans<<' ';
  }
  cout<<'\n';
}
main()
{
  cin.tie(0)->sync_with_stdio(0);
  for(cin>>T;T--;) solve();
}
2025/1/22 22:23
加载中...