双指针,一个从前往后扫,一个从后往前扫,如果过到最后撑起来答案都是一样的,就yes否则no


#include <iostream> #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #define int long long using namespace std ; int x , n , T ; int a[500] , b[500] , vis[14000] , tot = 0 , flag = 0 ; vector<int>v ; signed main () { cin >> T ; while(T --) { v.clear() ; memset(vis,0,sizeof(vis)) ; memset(b,0,sizeof(b)) ; cin >> n ;tot = 0 ;flag = 0 ; for(int i = 1 ; i <= 4*n ; i ++) { cin >> a[i] ; if(!vis[a[i]]) { b[++tot] = a[i]; vis[a[i]] ++ ; }else { vis[a[i]] ++ ; } } for(int i = 1 ; i <= tot ; i ++) { if(vis[b[i]] % 2 == 1 ) { //cout << "NO\n" <<endl ; //continue ; flag = 1 ; } else { vis[b[i]] /= 2 ; } } for(int i = 1 ; i <= tot ; i ++) { for(int j = 1 ; j <= vis[b[i]] ; j ++) { v.push_back(b[i]) ; } } sort(v.begin(),v.end()) ; int tot = v[0] * v[v.size()-1] ;int l = 0 ; while(l < n ) { if(v[l]*v[2*n-l-1] != tot ) { flag = 1 ; } l ++ ; } if(!flag) puts("YES") ; else puts("NO") ; } return 0 ; } 

溜了溜了