列表

详情


NC231930. 深渊水妖

描述

潜蛟舞,蜉蝣动,深渊水妖涟漪现。

你进行了 n 次考试,第 i 次考试的分数是 a_i

你想知道你最大进步的幅度是多少,定义最大进步的幅度为:

1. 选定一段 极长 的区间 ,满足

2. 满足条件一的情况下,使得 a_r-a_l 的值最大。

如果你有多段最大进步,你需要输出所有的最大进步段,每一段用两个数 l,r 表示,按照区间的左端点升序输出。

一句话题意:找到所有极长的不严格上升段,并找出它们当中右端点权值 - 左端点权值最大的那些个段,输出端点坐标。

输入描述

全文第一行输入一个正整数 ,表示数据组数。

每组数据第一行输入一个正整数

第二行输入 n 个正整数,第 i 个正整数是

数据保证 ,保证至少存在一个 满足

输出描述

对每组询问输出一行,表示你所得到的所有答案。

示例1

输入:

1
7
1 3 5 2 4 6 3

输出:

1 3 4 6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 1186ms, 内存消耗: 44088K, 提交时间: 2022-01-26 22:23:26

for _ in range(int(input())):
    d=int(input())
    a=list(map(int,input().split()))+[-1]
    lst=0
    cur=0
    ans={}

    for i in range(1,d+1):
        if a[i]>=a[i-1]:
            cur=i
        else:
            c=a[i-1]-a[lst]
            if c not in ans:
                ans[c]=[]
            ans[c].append([lst+1,i])
            lst=i
            cur=i
    ANS=[]
    for x,y in sorted(ans[max(ans)]):
        ANS.append(x)
        ANS.append(y)
    print(*ANS)

C++ 解法, 执行用时: 560ms, 内存消耗: 1836K, 提交时间: 2022-02-20 11:13:00

#include<iostream>
using namespace std;
void solve()
{
	int n,a[100005],l[100005];
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i],l[i]=0;
	int maxvalue=0,t=1;
	for(int i=1;i<=n;i++)
	{
		if(a[i+1]<a[i]||i==n)
		{
			l[i]=t;
			t=i+1;
			if(a[i]-a[l[i]]>maxvalue)
			maxvalue=a[i]-a[l[i]];
		}
	}
	for(int i=1;i<=n;i++)
	if(l[i]>0&&a[i]-a[l[i]]==maxvalue)
	cout<<l[i]<<" "<<i<<" ";
	cout<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	solve();
	return 0;
}

上一题