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