DUToj1031 大九神的难题

1031: 大九神的难题

Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:51   Accepted:14
[ Submit][ Status][ Discuss]

Description

大九神是ACM组一位传奇人物。在网络赛现场赛中屡立奇功。

什么爆搜过XXX,爆搜过XXX,爆搜过XXX,关于大九神的传说数不胜数。

今天大九神遇到了一个难题。ps.什么难题连大九神都能难倒。

大九神有一个长度为nn的数字串aa,然后要求cnt=ai+aj+|ij|, (ij)cnt=ai+aj+|i−j|, (i≠j)

大九神想知道cntcnt最大是多少,但是他最近写了太多的前端,水平不如当年那般神勇,你能帮帮他么?

Input

第一行一个整数TT表示数据组数(T20T≤20).

对于每组数据第一行是一个正整数nn表示位置的个数 (2n1052≤n≤105).

接下来一行nn个数字a1,,ana1,…,an (1ai1091≤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
****************************************************************/



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值