C. ~
题目链接:https://atcoder.jp/contests/abc406/tasks/abc406_c
题意:
给定一个排列,求满足条件
1.长度至少为4
2.只有一个波峰
3.只有一个波谷
4.开头两个数递增
的子数组数量
思路:
看出子数组前面一段是波峰,后面一段是波谷,然后还可以添加从波谷到下一个波峰的一段数组
波峰至波谷的这段一定需要,因此第一个波峰前面上升的序列A和第二个波峰前面上升的序列B是可选的
因此从前往后遍历答案叠加len(A)*len(B)
发现cnt.size()返回的是size_t(unsigned long)类型的无符号整数
所以当它为0再减1时,会变得非常大!
void solve(){
int n;cin>>n;
vector<int>a(n+1);
vector<int>cnt;
rep(i,1,n)cin>>a[i];
int y=0;
rep(i,2,n){
if(a[i]>a[i-1]){
y++;
}else{
if(y!=0){
cnt.pb(y);
y=0;
}
}
}
if(y){
cnt.pb(y);
}
int ans=0;
if(cnt.size()==0){
cout<<0<<endl;return;
}
for(int i=0;i<cnt.size()-1;i++){
ans+=cnt[i]*cnt[i+1];
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号