问题3032--最大子段和

3032: 最大子段和

时间限制: 5 Sec  内存限制: 1024 MB
提交: 11  解决: 2
[状态] [讨论版] [提交] [命题人:]
题目描述
小Z最近学习了最大子段和问题,这个问题是如何在一个序列中找出连续的一段,并且这一段的和最大。小Z经过学习,给出了这样的一个问题:
对于一个长度为n的序列,一共m次查询,每次给定一个区间[li,ri],能否快速求出该区间内的最大子段和?
特别的,如果区间内元素都小于等于0,那么区间最大子段和视为0。可以理解为选了一个空的子段。
相信这种程度的问题,难不倒聪明的你
输入

本题的IO量较大,为了避免IO效率影响算法速度的评判,我们采用一种特殊的方式输入数据

首先输入四个整数 n, m (1 ≤ n≤ 107) , k1, k2 (0 ≤ k1k2 ≤ 232 − 1) 分别是序列长度,询问次数,生成器种子。

再将下方代码中的 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<=n;i++){
    a[i]=xorShift128Plus()%200-100;
}

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

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]);
}
输出
为了避免输出的速度影响算法的判定,请你输出一行一个整数,代表每次询问的答案异或起来的值。
样例输入 Copy
100000 100000 998244353 1000000007
样例输出 Copy
9830