NC217897. 上进的凡凡
描述
凡凡是一个上进的人,他的人生没有下坡路,他也讨厌带有”下坡路“的东西。
所以,对于凡凡来说,只有非降序的数组才是nice的(如:1,2,2,3,4,5,5);若数组元素个数为1,也满足非降序,也是nice的。
现在有一个长度为n的数组,凡凡想知道它的子数组中有多少个数组是nice的。
你能帮帮他吗?
对于子数组的定义,如果可以通过从开头和从结束分别删除若干个(可以为零或全部,前后删除个数不必相同)元素来从数组b获得数组a,则称数组a是数组b的子数组。(子数组包含原数组,但不包含空串)
输入描述
第一行输入一个整数n(1≤n≤10^5),表示数组的长度。
第二行包含n个空格分隔的整数a1,a2,.,an(0≤ai≤10^9),为数组的元素。
输出描述
输出给定数组的子数组中是nice数组的个数。(注意使用long long)
示例1
输入:
5 1 2 3 4 5
输出:
15
C++(clang++11) 解法, 执行用时: 15ms, 内存消耗: 380K, 提交时间: 2021-01-30 13:11:54
#include<stdio.h> long long n,cnt=0,s,a,b; int main() { scanf("%lld",&n); s=0; b=0; for (long long i=1;i<=n;i++) { scanf("%lld",&a); if (a>=b) s++; else s=1; b=a; cnt+=s; } printf("%lld\n",cnt); return 0; }
pypy3(pypy3.6.1) 解法, 执行用时: 127ms, 内存消耗: 30460K, 提交时间: 2021-01-31 18:14:33
def f(n): return (n * (1 + n)) // 2 n = int(input()) a = list(map(int, input().split())) t, ans = 0, 0 for i in range(n): if i == n - 1 or a[i] > a[i + 1]: ans += f(i - t + 1) t = i + 1 print(ans)
C(clang11) 解法, 执行用时: 23ms, 内存消耗: 1084K, 提交时间: 2021-01-31 11:59:09
#include<stdio.h> int main() { long long n,i,s=0,a,b=0,S=0; scanf("%lld",&n); for(i=0;i<n;i++) { scanf("%lld",&a); if (a>=b) s++; else s=1; b=a; S+=s; } printf("%lld\n",S); return 0; }
Python3(3.9) 解法, 执行用时: 115ms, 内存消耗: 15368K, 提交时间: 2021-02-14 11:02:34
input() ar = [0] + list(map(int, input().split())) dp = ar.copy() for i in range(1, len(ar)): if ar[i] >= ar[i-1]: dp[i] = dp[i-1]+1 else: dp[i] = 1 print(sum(dp))