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