jzoj6288-旋转子段【优雅的暴力】
生活随笔
收集整理的這篇文章主要介紹了
jzoj6288-旋转子段【优雅的暴力】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
一個長度為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); }總結
以上是生活随笔為你收集整理的jzoj6288-旋转子段【优雅的暴力】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调查:你每月要消耗多少流量?
- 下一篇: 雷军:小米14本质上是小米14 Pro