[AGC063B] Insert 1, 2, 3, ... 题解
先来考虑怎样的区间是合法的。合法的区间
把上面的第二点转化一下,你就会发现——如果可以给每个
举个例子,序列
这个过程十分类似栈维护括号匹配,可以借助栈来完成类似的操作。
考虑枚举右端点
如果 continue(找不到前驱该元素不可能合法)。
每次答案加上栈的大小即可。时间复杂度
放代码(代码精悍短小):
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n; long long c=0; cin>>n;
stack<int> s;
for(int i=1;i<=n;i++){
int a; cin>>a;
if(a==1)s.emplace(1); // 如果是 1 就把它放进去
else{
while(!s.empty()&&s.top()+1!=a)s.pop();
// 不断弹出栈顶找前驱的过程
if(!s.empty())s.top()++; // 将栈顶改为 A[r]
}
c+=s.size(); // 答案加上合法左端点个数
}
cout<<c<<endl;
return 0;
}