原题传送门
一些小性质
- 每个数最多被被动一次
- 所有数都被改成原数列中出现次数最多的数为最优解
开桶弄出出现次数最多的数
因为是相邻两个数操作是的题目变得简单很多
正着做一遍,倒着做一遍就好了
Code:
#include <bits/stdc++.h>
#define maxn 200010
using namespace std;
int a[maxn], cnt[maxn], Max, n, num;
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
int main(){
n = read();
for (int i = 1; i <= n; ++i){
a[i] = read(); ++cnt[a[i]];
}
for (int i = 0; i <= 200000; ++i)
if (cnt[i] > Max) Max = cnt[i], num = i;
printf("%d\n", n - Max);
for (int i = 2; i <= n; ++i)
if (a[i - 1] == num && a[i] != num) printf("%d %d %d\n", a[i] > num ? 2 : 1, i, i - 1), a[i] = num;
for (int i = n - 1; i; --i)
if (a[i + 1] == num && a[i] != num) printf("%d %d %d\n", a[i] > num ? 2 : 1, i, i + 1), a[i] = num;
return 0;
}

本文探讨了一种通过操作相邻元素使数列所有元素变为出现频率最高的数的算法。该算法首先确定数列中出现最频繁的数,然后从两端向中间遍历,将不匹配的元素更改为该数,确保每次操作都是最优选择。
3134

被折叠的 条评论
为什么被折叠?



