思路:
我们考虑一个点i,把它转到它的对应点,肯定有一个转的轴。
我们不妨把每个轴能贡献多少的固定点给算出来,然后一个个去枚举当前轴的贡献,用前缀和算出不转的最大值,然后和轴的贡献加起来去最大值。
c o d e code code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = 1e6 + 10;
int n, ans;
int s[MAXN];
vector<int> q[MAXN];
int main() {
freopen("rotate.in", "r", stdin);
freopen("rotate.out", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= n; i ++) {
int x;
scanf("%d", &x);
if(x == i) s[i] = s[i - 1] + 1;
else s[i] = s[i - 1];
if(x > i) q[i + x].push_back(x);
else q[i + x].push_back(i);
}
for(int i = n * 2; i >= 1; i --) {
sort(q[i].begin(), q[i].end());
for(int j = 0; j < q[i].size(); j ++) {
ans = max(ans, s[i - q[i][j] - 1] + s[n] - s[q[i][j]] + j + 1);
}
}
printf("%d", ans);
return 0;
}