问题6760--最大子段和

6760: 最大子段和

[命题人 : ]
时间限制 : 3.000 sec  内存限制 : 512 MiB

题目描述

【题目描述】

鲍勃是一个顽强的少年,继排序研究和数学研究遭遇困难之后,他意识到算法的研究不能停留在理论层面,必须有扎实的编程技巧作为基础。于是他决定学习编程的知识。

鲍勃了解到,在编程中动态规划是非常重要的一个知识点。在他研究动态规划的时候遇到了这样一个问题:最大子段和问题,这个问题是:给你一个序列,你需要找出其中的一个子段 (不一定非空) 使

这一段的和是序列的所有段中最大的。

鲍勃突发奇想:这个题能不能改成:多次询问每次给一个区间,找出来这个区间内的最大子段和?

可惜的是,这似乎不是一个容易的问题,鲍勃又来寻求你的帮助了。

【输入格式】

第一行一个 n(1 ≤ n ≤ 2 × 10^6 ),代表序列的长度

其后一行 n 个数字,代表原序列 A,下标从 1 ∼ n|Ai | <= 10^3

其后一行一个 q(1 ≤ q ≤ 10^7 ), 代表询问的个数

其后输入一行两个整数 k1,k2(0 ≤ k1, k2 ≤ 2^32 − 1),其作用下方会说明

由于本题的询问次数过多,为了避免 IO 时间影响算法效率,本题采用特殊的方法来读入询问。

将下方代码中的 k1,k2 设为输入的 k1,k2

unsigned k1,k2;

unsigned long long xorShift128Plus() {

unsigned long long k3 = k1, k4 = k2;

k1 = k4;

k3 ^= k3 << 23;

k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);

return k2 + k4;

}

请你用下方的方式生成询问的区间

for(int i=1;i<=m;i++){

l[i]=xorShift128Plus()%n+1;

r[i]=xorShift128Plus()%n+1;

if(l[i]>r[i]) swap(l[i],r[i]);

}

【输出格式】

为了避免输出数据过多影响算法速度,你只需要输出一行一个整数代表每次询问的答案的异或和。

【样例】

subarray.in

subarray.out

5

1 -2 3 -1 5

2

998244353 1000000007

7

 

【提示】 

样例中,998244353 1000000007 作为 k1,k2, n 等于 5 时产生的前两个区间为 [2,2],[3,5]。这两个区间的最大子段和分别为 0 7,所以异或和是 7

【数据范围与约束】

测试点编号

n ≤

q ≤

1~3

1000

1000

4~7

2 × 10^5

2 × 10^5

8~10

2 × 10^5

10^7

 

来源/分类