1 条题解
-
0
题目大意
给你 个数,问你这 个数中有多少个双调序列,也就是说前半段严格上升,后半段严格下降。
具体思路
我们可以将一个双调序列拆分成两个部分,分别是左边的上升序列和右边的下降序列。我们用两个数组 和 分别表示以 结尾的上升序列有多少个和以 开头的下降序列有多少个。
如何计算 和 呢?首先是 , 显然是 ,接着从左往右推,如果 , 就是 ,否则 就为 。
同理,,从右往左推.如果 , 就是 ,否则 就为 。
那么,对于每一个 ,以 为峰值的双调序列个数就是 ,最后再累加起来就行。
完整代码
#include<bits/stdc++.h> #define int long long using namespace std; int a[300005]; int f[300005],f2[300005]; signed main(){ int n,ans=0; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; f[1]=f2[n]=1;//初始化 for(int i=2;i<=n;i++){ if(a[i]>a[i-1])f[i]=f[i-1]+1; else f[i]=1; }//计算f。 for(int i=n-1;i>0;i--){ if(a[i]>a[i+1])f2[i]=f2[i+1]+1; else f2[i]=1; }//计算f2。 for(int i=1;i<=n;i++)ans+=f[i]*f2[i];//相乘。 cout<<ans; return 0;//完结撒花! }
- 1
信息
- ID
- 10304
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者