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