题解:SP367 EMPODIA - Empodia
题解报告
考虑框段所满足的性质。可以发现有
但是这里要注意一个优化,就是我们可以缩短右端点枚举的范围,这样不仅可以降低时间复杂度,还可以保证找到的框段一定是障碍段。
具体实现看代码吧。
#include<bits/stdc++.h>
using namespace std;
const int INF=2e6+10;
int ans,a[INF];
int ans_l[INF],ans_r[INF],ed;
int main(){
int H;
cin>>H;
ed=H;
for (int i=1;i<=H;i++)cin>>a[i];
for (int i=H;i>=1;i--){//枚举首项
int maxn=a[i];
for (int j=i+1;j<=ed;j++){
if (a[j]<a[i])break;
if (a[j]>maxn&&a[j]-a[i]==j-i){
maxn=a[j];
ans_l[++ans]=i,ans_r[ans]=j;
ed=j;
break;
}
maxn=max(maxn,a[j]);
}
}
cout<<ans<<"\n";
for (int i=1;i<=ans;i++)cout<<ans_l[i]<<" "<<ans_r[i]<<"\n";
return 0;
}