C. Mere Array


思路:首先在a数组中找到最小的元素minn,然后将可以整除minn的分为一组,不可以整除minn的分为一组。不可以整除minn的数组元素是不可以更改位置的,因此,这个数组的元素必须是非递减的,如果不是非递减的,则结果为NO。可以看出,能够整除minn的数组元素可以通过minn变换位置,因此首先将这一数组从小到大排序,然后按照下标次序将这两个数组合并成一个数组,最后合并的数组必须是非递减的,否则结果为NO。
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int t, n; int a[N], b[N]; int s1[N], s2[N]; int z1[N], z2[N]; int main(){ cin >> t; while(t--){ cin >> n; for(int i=1;i<=n;i++) cin >> a[i]; int minn = 0x3f3f3f3f, cnt1=0, cnt2=0; for(int i=1;i<=n;i++) minn = min(minn, a[i]); for(int i=1;i<=n;i++){ if(a[i] % minn == 0) s1[++cnt1] = a[i], z1[cnt1] = i; else s2[++cnt2] = a[i], z2[cnt2] = i; } bool flag = true; for(int i=1;i<cnt2;i++) if(s2[i] > s2[i+1]){ flag = false; break; } if(!flag) cout << "NO" << endl; else{ flag = true; sort(s1+1, s1+1+cnt1); int ix1 = 1, ix2 = 1, ix = 1; while(ix1 <= cnt1 && ix2 <= cnt2){ if(z1[ix1] < z2[ix2]) b[ix++] = s1[ix1++]; else b[ix++] = s2[ix2++]; } while(ix1 <= cnt1) b[ix++] = s1[ix1++]; while(ix2 <= cnt2) b[ix++] = s2[ix2++]; for(int i=1;i<ix-1;i++) if(b[i] > b[i+1]){ flag = false; break; } if(flag) cout << "YES" << endl; else cout << "NO" << endl; } } return 0; }

浙公网安备 33010602011771号