牛客
链接:https://ac.nowcoder.com/acm/contest/11221/A
来源:牛客网
你进行了 nn 次考试,第 ii 次考试的分数是 a_ia
i
。
你想知道你最大进步的幅度是多少,定义最大进步的幅度为:
-
选定一段 极长 的区间 [l,r][l,r],满足 a_l\le a_{l+1}\le\cdots\le a_ra
l
≤a
l+1
≤⋯≤a
r
。 -
满足条件一的情况下,使得 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;
}