B. WeirdSort
题意:
有一个数组ai,和另一个数组pi,pi代表数组a中不同的位置,pi表示可以交换a[pi] 和 a[pi+1],任务是判断是否能够通过交换操作得到一个非下降序列。
题解(2种):
- 把pi排序遍历,满足条件时计数,当不满足条件时,把范围内的ai全部排序,最后判断是否符合条件。
- 直接暴力,遍历pi是否存在不符合非递减,不符合则交换两数,最后判断通过操作是否符合要求。(冒泡排序)。
ACcode:
//这里是第一种解法
int main() { ll t; cin >> t; while (t--) { int n, m; int a[110], b[110], vis[110]; memset(vis, 0, sizeof(vis)); cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i];//a[i]一定要从1开始,这样才能和b[]对应; for (int i = 0; i < m; i++) { cin >> b[i]; vis[b[i]] = 1; } sort(b, b + m);//先对b数组排序 int num = 0; for (int i = 1; i <= n; i++) { if (vis[i] == 1) { num++; vis[i] = 0; }//如果i可以交换,就计数,留在之后交换 else if (num>0)
{ { sort(a + i - num, a + i+1); num = 0; }//当i不能进行交换时,把之前记录的都交换 } } int flag = 0; for (int i = 1; i < n; i++) { if (a[i] > a[i + 1]) { flag = 1; break; } }//判断是否符合条件 if (flag == 1) cout << "NO" << endl; else cout << "YES" << endl; } return 0; }