自习室内有一个智能灯。
在
在
在 之间有
个不同时刻,不妨用
表示,其中
。
在这
现在,你可以最多额外指定一个时刻(也可以不指定),让管理员在此时刻也拨动开关一次。注意选定的时刻不能与
你的目的是让亮灯的总时长尽可能长。
输出这个最大亮灯总时长。
输入格式
第一行包含整数 ,表示共有
每组数据,第一行包含两个整数 和
。
第二行包含 个整数
。
输出格式
输出一个整数,表示最大亮灯总时长。
数据范围。
同一测试点内所有 的和不超过
。
输入样例:
3
3 10
4 6 7
2 12
1 10
2 7
3 4
输出样例:
8
9
6
- 当在奇数区间拨动开关时,总的亮灯时间等于
前(i-1)区间中奇数区间的和+(i+1)区间后偶数区间的和+(t-1) - 当在偶数区间拨动开关时,总的亮灯时间等于
前(i-1)区间中奇数区间的和+(i+1)区间后偶数区间的和+(t-1)
#include<iostream>
using namespace std;
const int N = 100010;
int n, m;
int a[N], s1[N], s2[N];
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
a[++n] = m;
s1[0] = s2[0] = 0;
for(int i = 1; i <= n; i++){
s1[i] = s1[i-1];
s2[i] = s2[i-1];
if(i % 2) s1[i] += a[i] - a[i-1];
else s2[i] += a[i] - a[i-1];
}
int res = s1[n];
for(int i = 1; i <= n; i++){
int t = a[i] - a[i-1];
if(t == 1) continue;
res = max(res, t-1+s1[i-1]+s2[n]-s2[i]);
}
printf("%d\n", res);
}
return 0;
}