Loading

Codeforces Round #665 (Div. 2) C. Mere Array 数论,思维

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 \neq 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");
}
posted @ 2020-08-22 16:07  MQFLLY  阅读(187)  评论(0编辑  收藏  举报