题解:CF2038C DIY

ivyjiao

2024-11-19 07:16:59

Solution

水题,十分钟切了。

很明显我们需要找到 4 组数对 (x,x)。其中两组 x 可以相同。

然后我们想到:

  1. 若数对数量 <4,无解。
  2. 观察样例 1 我们得到了一个很好的性质:我们需要找到 x1,2 小的数对,和第 1,2 大的数对,按照样例 1 所给的顺序输出即可,至于找数对,直接排序就行。

设第 1,2 小的数对为 x_1,x_2,第 1,2 大的数对为 x_3,x_4,由于我们要保证左下角的点 (x,y) 尽可能小,右上角的点 (x,y) 尽可能大,那么我们要找的点显然为 (x_1,x_2),(x_1,x_4),(x_3,x_2),(x_3,x_4),按照任意顺序输出(点的 (x,y) 不可改变)。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
unordered_map<int,int>mp;
int t,n,a[N];
vector<int>b;
int main(){
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            mp[a[i]]++;
        }
        for(int i=1;i<=n;i++){
            if(mp[a[i]]>1){
                mp[a[i]]-=2;
                b.push_back(a[i]);
            }
        }
        sort(b.begin(),b.end());
        if(b.size()<4) cout<<"NO"<<endl;
        else{
            cout<<"YES"<<endl;
            cout<<b[0]<<" "<<b[1]<<" "<<b[0]<<" "<<b[b.size()-1]<<" "<<b[b.size()-2]<<" "<<b[1]<<" "<<b[b.size()-2]<<" "<<b[b.size()-1]<<endl;
        }
        b.clear();
        mp.clear();
    }
}