#include<iostream>
using namespace std;
typedef long long LL;
const int L = 5005,N=55,INF=1e9;
int arr[L],l[N],r[N],sum[N],mx[N];
int n,m,len;
int main(void) {
cin>>n>>m;
for(int i=1; i<=n; i++) {
l[i]=r[i]=mx[i]=-INF;
cin>>len;
for(int j=1,pre=0,s=0; j<=len; j++) {
cin>>arr[j];
l[i]=max(l[i],sum[i]+arr[j]);
sum[i]+=arr[j];
//以arr[j]为结尾的和最大字串
pre=max(pre,0)+arr[j];
mx[i]=max(mx[i],pre);
}
for(int j=len,s=0; j>=1; j--) {
s+=arr[j];
r[i]=max(r[i],s);
}
}
LL pre=0,res=-INF;
while(m--) {
int b;
cin>>b;
res=max(res,(LL)mx[b]);
res=max(res,pre+(LL)l[b]);
pre=max((LL)r[b],pre+(LL)sum[b]);
}
cout<<res;
return 0;
}
- 首先,包含必要的头文件并使用命名空间。
- 定义一些常量,如
L
、N
、INF
和INF
的值。 - 定义一个整型数组
arr
,长度为L
,用于存储输入的数组元素。 - 定义三个整型数组
l
、r
和mx
,长度为N
,分别用于存储以当前位置为结尾的最大和、以当前位置为开头的最大和以及以当前位置为结尾的最大字串。 - 定义三个整型变量
n
、m
和len
,分别用于存储输入的数组长度、查询次数和数组元素的长度。 - 在主函数中,首先从标准输入读取
n
和m
的值。 - 对于每个数组元素(循环从1到
n
),执行以下步骤:
a. 将l[i]
、r[i]
和mx[i]
初始化为负无穷大。
b. 从标准输入读取数组元素的长度len
。
c. 创建一个循环,从1到len
,依次读取每个数组元素并将其存储在arr[j]
中。
d. 对于每个读取的数组元素,执行以下操作:
* 将该元素与当前位置的和相加,并更新sum[i]
的值。
* 计算以该元素为结尾的最大字串和,并更新mx[i]
的值。
* 更新以当前位置为结尾的最大和,并更新l[i]
的值。
e. 再次创建一个循环,从len
到1,依次计算以每个位置为开头的最大和,并更新r[i]
的值。
8. 创建一个循环,从0到m-1
(即执行查询的次数),对于每个查询,执行以下操作:
a. 从标准输入读取查询的索引值b
。
b. 更新最大值res
为以索引为结尾的最大字串和、当前位置为结尾的最大和以及当前位置为开头的最大和中的最大值。
9. 最后,将最大值res
输出到标准输出,程序结束。