比赛 4043级NOIP2022欢乐赛4th 评测结果 AWWWWWWWWW
题目名称 数字序列 最终得分 10
用户昵称 ZRQ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-07 22:04:26
显示代码纯文本
#include<bits/stdc++.h>
#define node pair<int,int> 
#define ll long long
using namespace std;
const int N=600010,INF=0x3f3f3f3f;
int n;
int a[N],dp[N],mx,pre[N],lim;
int t[N],p[N];
ll ans;
vector<int> s;
void updata(int i,int k,int pos)
{
	while(i<=lim+5)
	{
		if(k>t[i])
		{
			t[i]=k;
			p[i]=pos;
		}
		i+=i&-i;
	}
	return ;
}
node query(int i)
{
	int pos=0,res=0;
	while(i)
	{
		if(t[i]>res)
		{
			res=t[i];
			pos=p[i];
		}
		i-=i&-i;
	}
	return {res,pos};
}
int main()
{
	freopen("sequencec.in","r",stdin);
	freopen("sequencec.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),a[i]+=n+1,lim=max(lim,a[i]);
	for(int i=1;i<=n;++i)
	{
		node c=query(a[i]-i);
		dp[i]=c.first+1;
		pre[i]=c.second;
		updata(a[i]-i,dp[i],i);
		mx=max(mx,dp[i]);
	}
	int cur=n;
	while(dp[cur]!=mx) --cur;
	while(cur)
	{
		s.emplace_back(cur);
		cur=pre[cur];
	}
	s.emplace_back(0);
	s.emplace_back(n+1); 
	a[n+1]=INF;
	sort(s.begin(),s.end());
	cur=0;
	int l,r=-INF;
	for(int i=1;i<=n;++i)
	{
		if(i>s[cur])
		{
			l=r;
			++cur;
			r=a[s[cur]];
		}
		if(a[i]<=l) ans+=abs(l+i-s[cur-1]-a[i]);
		else if(a[i]>=r) ans+=abs(r-s[cur]+i-a[i]);
	}
	printf("%d\n%lld\n",n-mx,ans);
	return 0;
}