| 比赛 |
2025.12.13 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
排列变换 |
最终得分 |
100 |
| 用户昵称 |
Yis |
运行时间 |
3.355 s |
| 代码语言 |
C++ |
内存使用 |
10.08 MiB |
| 提交时间 |
2025-12-13 11:19:00 |
显示代码纯文本
#include<bits/stdc++.h>
#include<vector>
#define mid size/2
#define pol *2+1
#define por *2+2
using namespace std;
vector<int>st,pro,lazy;
int msize,n,oprcnt=0;
void build(){
int a=0,h=1,t=n;
while(t>1){
if(t&1)a=1;
h++;
t=t>>1;
}
if(a)h++;
msize=1<<(h-1);
st=vector<int>(2*msize-1,0);
lazy=vector<int>(2*msize-1,0);
int j=1;
for(int i=msize-1;i<msize-1+n;i++){
if(pro[j]>=j){
st[i]=1;
lazy[i]=pro[j]-j+1;
}else{
lazy[i]=1<<30;
}
j++;
}
for(int i=msize-1+n;i<st.size();i++){
st[i]=0;lazy[i]=1<<30;
}
for(int i=msize-1;i-->0;){
st[i]=st[i pol]+st[i por];lazy[i]=min(lazy[i pol],lazy[i por]);
}
}
void revise(int ind,int pos,int key,int size){
if(size==1){
st[ind]=1;
lazy[ind]=key;
return;
}
if(pos<=mid){
revise(ind pol,pos,key,mid);
}else{
revise(ind por,pos-mid,key,mid);
}
lazy[ind]=min(lazy[ind pol],lazy[ind por]);
st[ind]=st[ind por]+st[ind pol];
}
void renovate(int ind,int size){
if(size==1){
st[ind]=0;
lazy[ind]=1<<30;
return;
}
if(oprcnt<lazy[ind])return;
if(lazy[ind pol]<=oprcnt){
renovate(ind pol,mid);
}
if(lazy[ind por]<=oprcnt){
renovate(ind por,mid);
}
lazy[ind]=min(lazy[ind pol],lazy[ind por]);
st[ind]=st[ind por]+st[ind pol];
}
int main(){
freopen("permutrans.in","r",stdin);
freopen("permutrans.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
pro=vector<int>(n+1);
for(int i=1;i<=n;i++)cin>>pro[i];
build();
int ans=0,index=0;
ans=st[0];
for(int i=n;i>0;i--){
oprcnt++;
revise(0,i,pro[i]+oprcnt,msize);
if(oprcnt>=lazy[0])
renovate(0,msize);
if(ans<st[0]){
index=oprcnt;
ans=st[0];
}
}
cout<<ans<<' '<<index<<endl;
return 0;
}