比赛 CSP2023-J模拟赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 排列变换 最终得分 100
用户昵称 在大街上倒立游泳 运行时间 1.274 s
代码语言 C++ 内存使用 10.50 MiB
提交时间 2023-10-18 20:50:15
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,p[1000006],f[1000006],yi,da=0;//f(i)移动i-1位可成好数数量   差分  树状数组 
void add(long long x,long long v){
    while(x<=n+1){
        f[x]+=v;
        x+=x&(-x);
    }
}
long long qian(long long x){
    long long ans=0;
    while(x){
        ans+=f[x];
        x-=x&(-x);
    }
    return ans;
}
int main(){
    freopen("permutrans.in","r",stdin);
    freopen("permutrans.out","w",stdout);
    scanf("%lld",&n);
    for(long long i=1;i<=n;i++) scanf("%lld",&p[i]);
    for(long long i=1;i<=n;i++){
        if(p[i]>=i){
            add(1,1);
            add(min(n,p[i])-i+2,-1);
            add(n-i+2,1);
            add(n+1,-1);
        }
        else{
            add(n-i+2,1);
            long long fz=1;
            add(n-i+max(fz,p[i])+2,-1);
        }
    }
    for(long long i=0;i<n;i++){
        if(qian(i+1)>da){
            da=qian(i+1);
            yi=i;
        }
    }
    printf("%lld %lld",da,yi);
    return 0;
}