例题Status - Codeforces Round 1084 (Div. 3) - Codeforcesd题
思路我们先把传送门之间的元素看出一个整体a,把传送门之外的元素看出一个整体b,那么我们先找到a中最小值,然后将这个最小值向左移动到成为第一个元素为止,当然是整体移动(rotate函数
rotate(a.begin(),min_element(a.begin(),a.end()),a.end());
),接着在从b中找第一个大于min_element的位置,然后之间把a插入到这个位置前面就行了(insert函数
b.insert(b.begin()+pos,a.begin(),a.end());
)
rotate函数:
1.模板1:把区间【最小值】移到最前面
vector<int> v;
// 最小值迭代器
auto mn_it = min_element(v.begin(), v.end());
// 旋转,最小值放开头
rotate(v.begin(), mn_it, v.end());
2.模板2:数组整体【左移 k 位】
// 左移k位模板
rotate(v.begin(), v.begin() + k, v.end());
3.模板3:局部区间旋转(只转中间一段)
// 转 [l, r) 区间,从第mid个位置开始当头
mid 位置及往后 → 搬到这段的最前面
l ~ mid-1 这一段 → 整体丢到这段的最后面
rotate(v.begin()+l, v.begin()+mid, v.begin()+r);
4.模板4:把末尾 k 个元素移到最前面(右移效果)
int k = 2;
rotate(v.begin(), v.end() - k, v.end());