求助TLE90
查看原帖
求助TLE90
428449
Amon_Xolotl楼主2023/9/13 15:33
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=35000+3;
int n,a[N],b[N],c[N],cnt,s[N],ans,tot,answer,first[N];
ll sumL[N],sumR[N];
ll f[N];
vector<int> G;
bool vis[100005];
struct zjy
{
  int id,w;
  bool operator < (zjy t) const{
  return w<t.w;
  }
};
ll Abs(ll x)
{
  if(x>0)
  {
    return x;
  }
  else
  {
    return -x;
  }
}
signed main()
{
  scanf("%d",&n);
  for(register int i=1;i<=n;++i)
  {
    scanf("%d",&a[i]);
    b[i]=a[i]-i;
  }
  priority_queue<zjy> q;
  q.push((zjy){0,0});
  for(register int i=1;i<=n;++i)
  {
    while(b[q.top().id]>b[i]&&(!q.empty()))
    {
      c[++cnt]=q.top().id;
      q.pop();
    }
    if(!q.empty())
    {
      s[i]=s[q.top().id]+1;
    }
    else
    {
      s[i]=1;
    }
    ans=max(ans,s[i]);
    for(int j=cnt;j>=1;--j)
    {
      
      q.push((zjy){c[j],s[c[j]]});
    }
    q.push((zjy){i,s[i]});
    cnt=0;
  }
  cout<<n-ans<<endl;
  while(!q.empty())
  {
    G.push_back(q.top().id);
    if(!vis[q.top().w])
    {
     first[q.top().w]=G.size()-1;
     vis[q.top().w]=1; 
    }
    q.pop();
  }
  int last=n+1; 
  b[last]=1e9;
  s[last]=ans+1;
  cnt=0;
  memset(f,0x3f3f,sizeof(f));
  f[0]=0ll;
  b[0]=-1e9;
  for(register int i=1;i<=n+1;++i)
  {
    for(register int j=first[s[i]-1];j<G.size();++j)
    {
      if(b[G[j]]>b[i]||G[j]>i)
      {
        continue;
      }
      if(s[G[j]]!=s[i]-1)
      {
        break;
      }
      int u=G[j];
 //     cout<<u<<" "<<s[i]<<" "<<i<<" ";
      sumL[u]=0;
      for(register int k=u+1;k<i;++k)
      {
        sumL[k]=sumL[k-1]+Abs((ll)(b[k]-b[u]));
   //     cout<<sumL[k]<<" ";
      }
    //  cout<<" ";
      sumR[i-1]=0;
      for(register int k=i-2;k>=u;--k)
      {
        sumR[k]=sumR[k+1]+Abs((ll)(b[k+1]-b[i]));
    //    cout<<sumR[k]<<" ";
      }
      for(register int k=u;k<i;++k)
      {
        f[i]=min(f[i],f[u]+sumL[k]+sumR[k]);
      }
  //    cout<<f[i]<<endl;
    }
  }
  printf("%lld",f[n+1]);
  return 0;
}
2023/9/13 15:33
加载中...