const int maxn=1e5+5;
int a[maxn]={0};
stack<int>s;
int main()
{
int n;cin>>n;
long long ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>a[i-1])///后一个比前一个大,说明若第i-1个已经建好了(顺便把第i个建到a[i-1]层),还需要建a[i]-a[i-1]次才能建好第i个
ans=ans+a[i]-a[i-1];///更新答案
}
cout<<ans<<endl;
for(int i=1;i<=n;i++)
{
if(a[i]>a[i-1]) ///说明递增,则入栈
for(int j=a[i];j>a[i-1];j--) s.push(i);///先入栈的序号所对的a[i]小,所以建的次数少(后出栈)
if(a[i]>a[i+1]) ///a[i]>a[i+1],说明不单调递增了,把单调的输出
for(int j=a[i];j>a[i+1]&&!s.empty();j--) ///建a[i]-a[i+1]次,那么第i个剩余的需要建立的层数就和第i+1个一样了
{
printf("%d %d\n",s.top(),i); ///建立栈顶所对下标s.top()到i
s.pop();///出栈
}
}
}
问题 N: 扶桑号战列舰
最新推荐文章于 2019-08-07 15:51:40 发布

1208

被折叠的 条评论
为什么被折叠?



