题意: 解法: 将每个元组变为二元组(val,type), 混合,以val为关键字从小到大排序, 枚举r,维护l,当[l,r]中有四种衣服时, 用a[r].val-a[l].val更新答案最小值即可. 由于题目要求输出方案, 多开4个队列分别存[l,r]中每种衣服的值即可. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=4e5+5; struct Node{ int x,f; }a[maxm]; queue<int>q[4]; int ans[4]; int n; bool cmp(Node a,Node b){ return a.x<b.x; } void solve(){ for(int i=0;i<4;i++){ int k;cin>>k; for(int j=1;j<=k;j++){ int x;cin>>x; a[++n]={x,i}; } } sort(a+1,a+1+n,cmp); int mi=1e9; int sum=0,l=1; for(int i=1;i<=n;i++){ q[a[i].f].push(a[i].x); if(q[a[i].f].size()==1)sum++; while(sum==4){ if(a[i].x-a[l].x<mi){ mi=a[i].x-a[l].x; for(int j=0;j<4;j++){ ans[j]=q[j].front(); } ans[a[i].f]=a[i].x; } q[a[l].f].pop(); if(q[a[l].f].empty())sum--; l++; } } for(int i=0;i<4;i++){ cout<<ans[i]<<' '; } } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }