列表

详情


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))

上一题