WangYongkai__AFO
2024-11-19 07:45:38
Solution:
首先我们简化一下题意,其实题目求得就是在给定的 Yes
以及四点坐标,否则输出No
。
赛时思路:通过手动模拟一下我们得知,给定的 map
来计算每个数出现的次数,同时开一个 vector
将能够作为矩形顶点坐标的数 push_back
进去,如果 vector.size()<4
,则说明给出的数无法选出满足条件的四个数,直接输出 No
。如果 vector.size()>=4
再对 vector
排序,选最小、次小、最大、次大的四个数,分别输出坐标即可。
本题坑点:
2.在计数的时候,若某个数已经出现了 push_back
的同时要将它对应的计数个数清零,因为会出现选择
3.输出时要仔细考虑四个数的坐标关系再输出。
代码如下:
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<bitset>
#include<iomanip>
#include<cstdlib>
#define int long long
using namespace std;
int T;
int n;
const int N=2e5+5;
int a[N];
vector<int>e;
signed main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--)
{
e.clear();
map<int,int>vis;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i],vis[a[i]]++;
if(vis[a[i]]==2)
{
e.push_back(a[i]);
vis[a[i]]=0;
}
}
if(e.size()<4)
{
cout<<"No"<<'\n';
continue;
}
sort(e.begin(),e.end());
int len=e.size();
cout<<"Yes"<<'\n';
cout<<e[len-1]<<' '<<e[len-2]<<' '<<e[len-1]<<' '<<e[0]<<' ';
cout<<e[1]<<' '<<e[len-2]<<' '<<e[1]<<' '<<e[0]<<'\n';
}
return 0;
}