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;
}
posted @ 2025-05-19 09:33  Marinaco  阅读(21)  评论(0)    收藏  举报
//雪花飘落效果