1031: 大九神的难题
Time Limit:3000/1000 MS (Java/Others) Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:51 Accepted:14
[
Submit][
Status][
Discuss]
Total Submissions:51 Accepted:14
Description
大九神是ACM组一位传奇人物。在网络赛现场赛中屡立奇功。
什么爆搜过XXX,爆搜过XXX,爆搜过XXX,关于大九神的传说数不胜数。
今天大九神遇到了一个难题。ps.什么难题连大九神都能难倒。
大九神有一个长度为nn的数字串aa,然后要求cnt=ai+aj+|i−j|, (i≠j)cnt=ai+aj+|i−j|, (i≠j)
大九神想知道cntcnt最大是多少,但是他最近写了太多的前端,水平不如当年那般神勇,你能帮帮他么?
Input
第一行一个整数TT表示数据组数(T≤20T≤20).
对于每组数据第一行是一个正整数nn表示位置的个数 (2≤n≤1052≤n≤105).
接下来一行nn个数字a1,…,ana1,…,an (1≤ai≤1091≤ai≤109).
Output
对于每组样例输出一个数字表示cntcnt的最大值
Sample Input
3
5
1 2 3 4 5
5
5 4 3 2 1
5
1 2 5 3 4
Sample Output
10
10
11
HINT
Source
链接(需要校园网):
http://202.118.67.200:7217/codesheaven/problem.php?id=1031
计从左看权值数l[i]为a[i]-(i-1),右边r[i]为a[i]-(n-i),则cnt=n-1+l[lmax]+r[rmax]。显然L数组最大数所在位置不能超过R数组最大数。相等的话取左右各判断下就好。
代码:
#include<bits/stdc++.h>
using
namespace
std;
int
main()
{
int
t;
scanf
(
"%d"
,&t);
int
a[100100];
int
l[100100];
int
r[100100];
int
n;
while
(t--)
{
scanf
(
"%d"
,&n);
for
(
int
i=1;i<=n;i++)
{
scanf
(
"%d"
,&a[i]);
l[i]=a[i]-i+1;
r[i]=a[i]-(n-i);
}
int
lm,lmax,rm,rmax;
lm=1;lmax=l[1];rm=n;rmax=r[n];
for
(
int
i=2;i<=n;i++)
{
l[i]=max(l[i],l[i-1]);
if
(l[i]>lmax)
{
lm=i;lmax=l[i];
}
}
for
(
int
i=n-1;i>=1;i--)
{
r[i]=max(r[i],r[i+1]);
if
(rmax<r[i])
{
rm=i;rmax=r[i];
}
}
if
(rm==lm)
{
printf
(
"%d\n"
,max(l[lm]+r[rm+1]+n-1,l[lm-1]+r[rm]+n-1));
}
else
{
printf
(
"%d\n"
,l[lm]+r[rm]+n-1);
}
}
}
/**************************************************************
Problem: 1031
User: funer
Language: C++
Result: Accepted
Time:24 ms
Memory:2704 kb
****************************************************************/