正题
题目大意
一个长度为nnn的序列。可以选择一段区间旋转,求使得∑i=1n[ai==i]\sum_{i=1}^n[a_i==i]∑i=1n[ai==i]最大。
解题思路
现在序列中每隔一个插入一个#\##号(伪插入)
用gig_{i}gi表示以中点为iii的序列翻转后能够对应的数字。
然后枚举中心点,然后从短到长枚举翻转可以对应的数组,然后统计答案。
codecodecode
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=500010;
int n,a[N],s[N],ans;
vector<int> g[N];
int main()
{freopen("rotate.in","r",stdin);freopen("rotate.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);g[i+a[i]].push_back(abs(a[i]-i));s[i]=s[i-1]+(a[i]==i);}for(int i=1;i<=2*n;i++)if(!g[i].empty()){sort(g[i].begin(),g[i].end());int k=g[i].size();for(int j=0;j<k;j++){int l=(i-g[i][j])/2,r=(i+g[i][j])/2;ans=max(ans,s[n]-s[r]+s[l-1]+j+1);}}printf("%d",ans);
}