社区讨论

90分一个MLE求调

P6510奶牛排队参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjnvkit
此快照首次捕获于
2025/11/04 05:37
4 个月前
此快照最后确认于
2025/11/04 05:37
4 个月前
查看原帖
代码
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m;
int ans=0;
struct ddd
{
  int t,id;
};
ddd st[100005][35],st2[100005][35];
bool check(int l,int r)
{
  if(l==r) return 0;
  if(st[l][0].t>=st[r][0].t) return 0;
  for(int i=l+1;i<=r-1;i++)
    {
      if(st[i][0].t<=st[l][0].t||st[i][0].t>=st[r][0].t) return 0;
    }
  return 1;
}
void f(int l,int r)
{
  if(r-l+1<2) return;
  if(ans>=r-l) return;
  if(r-l+1==2)
    {
      if(st[r][0].t>st[l][0].t) ans=max(2,ans);
      return;
    }
  int k=log2(r-l+1);
  int tl,ts;
  if(st[l][k].t>st[r-(1<<k)+1][k].t) tl=st[l][k].id;
  else tl=st[r-(1<<k)+1][k].id;
  if(st2[l][k].t<st2[r-(1<<k)+1][k].t) ts=st2[l][k].id;
  else ts=st2[r-(1<<k)+1][k].id;
  if(tl==ts) return;
  if(tl>ts)
    {
      if(check(ts,tl)==1) ans=max(ans,(tl-ts+1));
      if(r-tl>ans) f(tl+1,r);
      if(ts-l+1>ans) f(l,ts);
    }
  else{
    if(ts-1-tl>ans) f(tl+1,ts-1);
    if(tl+1-l+1>ans) f(l,tl+1);
    if(r-ts+1>ans) f(ts,r);
  }
}
signed main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
    {
      cin>>st[i][0].t;
      st2[i][0].t=st[i][0].t;
      st2[i][0].id=i;
      st[i][0].id=i;
    }
  for(int i=1;i<=log2(n);i++)
    {
      for(int j=1;j<=n-(1<<i)+1;j++)
        {
          st[j][i].t=max(st[j][i-1].t,st[j+(1<<(i-1))][i-1].t);
          if(st[j][i-1].t>st[j+(1<<(i-1))][i-1].t) st[j][i].id=st[j][i-1].id;
          else st[j][i].id=st[j+(1<<(i-1))][i-1].id;
          st2[j][i].t=min(st2[j][i-1].t,st2[j+(1<<(i-1))][i-1].t);
          if(st2[j][i-1].t<st2[j+(1<<(i-1))][i-1].t) st2[j][i].id=st2[j][i-1].id;
          else st2[j][i].id=st2[j+(1<<(i-1))][i-1].id;
        }
    }
  f(1,n);
  cout<<ans;
  return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...