[双指针] aw3784. 交换相邻元素(思维+算法优化+CF920C)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[双指针] aw3784. 交换相邻元素(思维+算法优化+CF920C)相关的知识,希望对你有一定的参考价值。
1. 题目来源
链接:3784. 交换相邻元素
2. 题目解析
一个连续 1 的区间,[l, r]
,能够让 [l, r + 1]
的数字变成有序状态。那么只需要每次找到一个连续 1 的区间,将区间内的数进行排序,最终检测数组是否为有序状态即可。
推广:
- 如果区间
[l, r+1]
中是有序状态并且合法的话,那么区间内部的元素要能够与下标一一对应起来,否则显然不成立。 - 一个连续区间,我们仅需记录区间中的最大值,最小值,判断是否等于区间长度即可。
- 进一步推广,我们仅需记录最大值即可,最小值由上个区间的右边界就决定好了。
推广部分没写代码,不太实用。但本题的这样设计,显然是要这样做的。
时间复杂度: O ( n l o g n ) O(\\sqrt n log\\sqrt n) O(nlogn)
空间复杂度: O ( n ) O(\\sqrt n) O(n)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n;
int a[N];
char g[N];
int main() {
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> a[i];
cin >> g;
int l = 0, r = 0;
while (r < n) { // 双指针找连续的1区间段
while (r < n && g[r] == '1') r ++ ;
sort(a + l, a + r + 1);
r ++ ;
l = r;
}
puts(is_sorted(a, a + n) ? "YES" : "NO");
return 0;
}
以上是关于[双指针] aw3784. 交换相邻元素(思维+算法优化+CF920C)的主要内容,如果未能解决你的问题,请参考以下文章