比赛 |
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;
}