深渊水妖(容器)

牛客
链接:https://ac.nowcoder.com/acm/contest/11221/A
来源:牛客网

你进行了 nn 次考试,第 ii 次考试的分数是 a_ia
i

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

  1. 选定一段 极长 的区间 [l,r][l,r],满足 a_l\le a_{l+1}\le\cdots\le a_ra
    l

    ≤a
    l+1

    ≤⋯≤a
    r

  2. 满足条件一的情况下,使得 a_r-a_la
    r

    −a
    l

    的值最大。

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

一句话题意:找到所有极长的不严格上升段,并找出它们当中右端点权值 - 左端点权值最大的那些个段,输出端点坐标。
输入描述:
全文第一行输入一个正整数 T(1\le T\le10^5)T(1≤T≤10
5
),表示数据组数。

每组数据第一行输入一个正整数 n(2\le n\le10^5)n(2≤n≤10
5
)。

第二行输入 nn 个正整数,第 ii 个正整数是 a_i(1\le a_i\le n)a
i

(1≤a
i

≤n)。

数据保证 \sum n\le3\times10^6∑n≤3×10
6
,保证至少存在一个 i\in[2,n]i∈[2,n] 满足 a_i\ge a_{i-1}a
i

≥a
i−1


输出描述:
对每组询问输出一行,表示你所得到的所有答案。
示例1
输入
复制
1
7
1 3 5 2 4 6 3
输出
复制
1 3 4 6

首先找出所有的上升序列 然后这段上升序列的起始和结束位置存到容器里 并且记录首位的最大差值,这里的容器用了pair 学西了auto遍历
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int a[100010];
typedef pair<int,int>qo;
int main()
{
	int i,j,k,m,n,t;
	scanf("%d",&t);
	while(t--)
	{
		vector<qo>q;
		scanf("%d",&n);
		int l=1,r=1,d=0;
		for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
		for(i=2; i<=n; i++)
		{
//			scanf("%d",&a[i]);
			if(a[i]>=a[i-1])
			{
				r=i;
			}
			else
			{
				q.push_back(make_pair(l,r));
				l=r=i;
			}
			d=max(d,a[r]-a[l]);
		}
		q.push_back(make_pair(l,r));
		for(auto x:q)
		{
//			printf("~~~~~ \n");
			if(a[x.second]-a[x.first]==d)
				printf("%d %d ",x.first,x.second);
		}
		printf("\n");

	}
	return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值