Codeforces Round #665 (Div. 2) C. Mere Array
题意
给定数组(a) ,可以交换(a_i , a_j) 当且仅当$Min | (a_i,a_j) $ ,其中(Min) 为(a) 数组的最小值
问能否通过交换使得数组(a) 不降
分析
考虑需要交换的元素有哪些?
建立数组(b) ,对(b) 排序,如果$a_i eq b_i $ ,说明(a_i) 是需要交换的。显然,若(Min) 不能整除这个(a_i) ,则(a_i) 永远没办法交换,直接(return false) 。否则,必然可以通过交换到相应的位置,如何交换?可以不断利用(Min) 作为跳板,具体证明略。
代码
ll a[maxn];
ll b[maxn];
bool solve() {
vector<ll> v;
int n = readint();
ll Min = 1e18;
for (int i = 0; i < n; i++) a[i] = readll(), b[i] = a[i], Min = min(Min, a[i]);
sort(b, b + n);
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
if (a[i] % Min != 0) return false;
}
}
return true;
}
int main() {
int T = readint();
while (T--) if (solve()) puts("YES");
else puts("NO");
}