社区讨论
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 条回复,欢迎继续交流。
正在加载回复...